在很多比较复杂的宏定义中,经常可以看到整个接口被一层do while(0)
给包了起来
#define Foo(x) do{\
printf("first statement\n");\
printf("second statement\n");\
}while(0)
这样定义的是一个非复合语句,可以确保在类似下面这种情况
if(xxx)
Foo(x)
else
...
可以顺利展开,展开后的结果被do while
包了起来
if(xxx)
do {
printf("first statement\n");
printf("second statement\n");
}while(0)
else
...
如果没有加do while而只用一个花括号的话,宏在预处理的时候会去掉花括号直接展开成下面这种复合语句,这样就会报错了
if(xxx)
printf("first statement\n");
printf("second statement\n");
else
...