看ACE的源码,发现它的宏很多都会加上do{}while(0)包起来,以前认为多此一举。既然是出至名家之手,自然有它的道理,问过一些同事,他们也不是很清楚。最近在编译代码时才发现
1.用{}代替do{}while(0)能解决临时变量作用域的问题,但在if...else情况下会有问题。
比如有宏定义如下:
编译展开之后就变成
由上可看出
1.宏最好用do{}while(0)包起来;
2.if后面最好加上{},else也如此。
1.用{}代替do{}while(0)能解决临时变量作用域的问题,但在if...else情况下会有问题。
比如有宏定义如下:
#define ADEF()\
{ int a=0; do_something();}
在if else情况下
if
ADEF();
else
do_something();
{ int a=0; do_something();}
在if else情况下
if
ADEF();
else
do_something();
编译展开之后就变成
if
{ int a=0; do_something();}; // 最后一个;把ifelse分割了,自然编译也通不过了
else
do_something();
{ int a=0; do_something();}; // 最后一个;把ifelse分割了,自然编译也通不过了
else
do_something();
由上可看出
1.宏最好用do{}while(0)包起来;
2.if后面最好加上{},else也如此。