do{} while(0)的使用

来源:互联网 发布:洪泽新闻网农村淘宝 编辑:程序博客网 时间:2024/04/18 17:57

      如果你做过linux,你就会发现在很多地方的宏定义会用到:#define  XXX_XXXX  do{xxxx;xxx;}while(0)

为什么这种执行一次的语句要有这种方式来实现。当然有原因!
      为了看起来更清晰,这里用一个简单点的宏来演示:
#define SAFE_DELETE(p) do{ delete p; p = NULL} while(0)
假设这里去掉do...while(0),成#define SAFE_DELETE(p) delete p; p = NULL;
那么以下代码:
if(NULL != p)

     SAFE_DELETE(p)
else  

      ...do sth...
就有两个问题:
1) 因为if分支后有两个语句,else分支没有对应的if,编译失败
2) 假设没有else, SAFE_DELETE中的第二个语句无论if测试是否通过,会永远执行。

      那我直接用{}括起来就可以了,成#define SAFE_DELETE(p) { delete p; p = NULL;},那么如下语句会有问题:
if(NULL != p)

     SAFE_DELETE(p);   //替代完毕后扩后后面还会有个分号,也是问题
else  

      ...do sth...

如果用do while(0),则成:

if(NULL != p)

     do

     { delete p;p=NULL;}while(0);

else  

      ...do sth...

原创粉丝点击