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