看ACE的源碼,發(fā)現(xiàn)它的宏很多都會加上do{}while(0)包起來,以前認為多此一舉。既然是出至名家之手,自然有它的道理,問過一些同事,他們也不是很清楚。最近在編譯代碼時才發(fā)現(xiàn)
1.用{}代替do{}while(0)能解決臨時變量作用域的問題,但在if...else情況下會有問題。
比如有宏定義如下:
#define ADEF()\
{ int a=0; do_something();}
在if
else情況下
if
ADEF();
else
do_something();
編譯展開之后就變成
if
{int a=0; do_something();}; //最后一個;把if
else分割了,自然編譯也通不過了
else
do_something();
由上可看出
1.宏最好用do{}while(0)包起來;
2.if后面最好加上{},else也如此。