关于 do { ... } while (0)

2026阅读 0评论2010-11-02 ghoststears
分类:

  在看很多开源代码的时候,经常会碰到在宏定义中使用 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
   
...

  经过上面的小例子,已经很能说明问题了。这种用法很经典啊。
上一篇:将“女朋友7.0”升级到“妻子1.0”后
下一篇:类成员指针