牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

宏别忘了do{}while(0)

看ACE的源码,发现它的宏很多都会加上do{}while(0)包起来,以前认为多此一举。既然是出至名家之手,自然有它的道理,问过一些同事,他们也不是很清楚。最近在编译代码时才发现

1.用{}代替do{}while(0)能解决临时变量作用域的问题,但在if...else情况下会有问题。
比如有宏定义如下:
#define ADEF()\
     { 
int a=0; do_something();}
在ifelse情况下
if
   ADEF();
else
do_something();


编译展开之后就变成
if
   {
int a=0; do_something();}; //最后一个;把ifelse分割了,自然编译也通不过了
else
do_something();


由上可看出
1.宏最好用do{}while(0)包起来;
2.if后面最好加上{},else也如此。

posted on 2008-01-17 13:56 杨粼波 阅读(384) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理