2010年4月26日 星期一

[語言] 沒營養的 - do{} while(0)

看code 有時候會看到沒營養的
do{ XXX } while(0)

直覺上會覺得很北七...  顯然北七的只是表面...
這種寫法常見在

#define


#define BEJO(x) {a(x-2);b(x);} while(0)
#define a(x) printf("%d\n", x)
#define b(x) printf("%d\n", x)

如果這樣寫
#define BEJO(x) a(x-2);b(x);

if(x >0 )
   BEJO(x);
else
.....
會被展開成
if(x >0 )
   a(x-2);b(x);;
else
.....

當場就b(x)爆炸了.....

那如果這樣寫
#define BEJO(x) {a(x-2);b(x)}
就...
if(x >0 )
   {a(x-2);b(x)};
else
.....

那如果這樣寫
#define BEJO(x) {a(x-2);b(x);}
就...
if(x >0 )
   {a(x-2);b(x);};
else
.....

不管怎麼寫~~都有可能會被呼叫者誤用到爆炸
按照
本來BEJO(x); <-- 會加分號的習性

do{} while(0)

剛剛好...
if(x >0 )
   BEJO(x);
else
.....
會被展開成
if(x >0 )
   {a(x-2);b(x);} while(0);
else
.....

很安全.....