最近看到C语言的项目中在宏定义中使用了do...while(0),感到是个知识点,特来总结。
先看这句话:do{...}while(0)在C中是唯一的构造程序,让你定义的宏总是以相同的方式工作,这样不管怎么使用宏(尤其在没有用大括号包围调用宏的语句),宏后面的分号也是相同的效果。这句话的意思是说,在宏定义中使用do...while(0)包含的所有语句是一个代码块,不会受到{};的影响。
看一个例子:
#include <stdio.h>
#include <stdlib.h>
#define TEST(p) \
do \
{ \
if(p!=NULL) \
{ \
free(p); \
printf("free success!\n"); \
} \
p=NULL; \
}while(0)
int main()
{
int *p=NULL;
p=(int*)malloc(sizeof(int));
TEST(p);
printf("---------done!---------\n");
return 0;
}
\的作用是这一行的语句没有完,下一行内容是跟上一行联在一起的。
再来看一个出错的例子:
宏定义: #define foo(x) bar(x); baz(x)
然后调用: foo(x); 这样根据宏替换的原则就是: bar(x);baz(x); 这是正确的!
但是如果这样: if()
foo(x)
就会被替换成: if()
bar(x);
baz(x); 这显然是和我们希望执行的是不一样的!
为什么不用大括号直接
把宏包围起来呢?为什么非得使用do/while(0)逻辑呢?
按照上面的例子:
if
()
{
bar(wolf);
baz(wolf);
}; //最后会添加;,在语法上是错误的!