在看很多开源代码的时候,经常会碰到在宏定义中使用 do{}while(0) 这样的语句,刚开始也没怎么在意,知道自己定义比较复杂的宏出了问题之后,才恍然大悟。
下面用一个小例子展示一下,为神马要在宏定义中使用 do{}while(0):
#define SAFE_FREE(p) free(p); p = NULL;
那么下面的代码:
if (NULL != p)
SAFE_FREE(p);
else
...
经过宏展开后,将呈现:
if (NULL != p)
free(p); p = NULL;
else
...
再整理一下,就是这个样子了:
if (NULL != p)
free(p);
p = NULL;
else
...
这种是一个明显的错误,我就不解释了。如何解决这个问题呢,修正一下吧。宏写成这样:
#define SAFE_FREE(p) { free(p); p = NULL; }
那么,上面的代码将会被展开正这样:
if (NULL != p)
{ free(p); p = NULL; };
else
...
这样,else分支就有没有对应的if了,编译将无法通过。
再改进一下吧,写成这样:
#define SAFE_FREE(p) do { free(p); p = NULL; } while(0)
那么代码会被展开成这个样子:
if (NULL != p)
do { free(p); p = NULL; } while(0);
else
...
经过上面的小例子,已经很能说明问题了。这种用法很经典啊。
阅读(2000) | 评论(0) | 转发(0) |