Chinaunix首页 | 论坛 | 博客
  • 博客访问: 276055
  • 博文数量: 37
  • 博客积分: 3789
  • 博客等级: 少校
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-02 16:49
文章分类

全部博文(37)

文章存档

2011年(7)

2010年(30)

分类:

2010-11-02 17:08:21

  在看很多开源代码的时候,经常会碰到在宏定义中使用 do{}while(0) 这样的语句,刚开始也没怎么在意,知道自己定义比较复杂的宏出了问题之后,才恍然大悟。
  下面用一个小例子展示一下,为神马要在宏定义中使用 do{}while(0):

     #define SAFE_FREE(p) free(p);= NULL;

  那么下面的代码:

 
if (NULL != p)
   
SAFE_FREE(p);
 
else
   
...

  经过宏展开后,将呈现:

 
if (NULL != p)
   
free(p);= NULL;
 
else
   
...

  再整理一下,就是这个样子了:

  if (NULL != p)
   
free(p);

  p = NULL;
 
else
   
...

     这种是一个明显的错误,我就不解释了。如何解决这个问题呢,修正一下吧。宏写成这样:

    #define SAFE_FREE(p) { free(p);= NULL; }

  那么,上面的代码将会被展开正这样:

 
if (NULL != p)
   
{ free(p);= NULL; };
 
else
   
...

 
这样,else分支就有没有对应的if了,编译将无法通过。
  再改进一下吧,写成这样:

    #define SAFE_FREE(p) do { free(p);= NULL; } while(0)

  那么代码会被展开成这个样子:

 
if (NULL != p)
   
do { free(p);= NULL; } while(0);
 
else
   
...

  经过上面的小例子,已经很能说明问题了。这种用法很经典啊。
阅读(2000) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~