1.使用do-while(0):为了能够在条件语句中使用复杂的宏定义。
#include <stdio.h>
#include <stdlib.h>
#define FOO(x) \
printf("x=%d\n",x); \
x++;
#define FOO2(x) \
do{ \
printf("x=%d\n",x); \
x++; \
}while(0)
int main()
{
printf("Hello world!\n");
int x = 5;
if(x==5)FOO2(x);
printf("x1=%d\n",x);
if(x==5)FOO(x);
printf("x2=%d\n",x);
return 0;
}
调用FOO(x)在条件语句if(x==5)之后,按照预期,此时x=6,应当不执行该调用。确实,并没有执行printf("x=%d",x);但是执行了x++的操作,导致x2=7.
但是单纯把宏定义的多条指令用{}括起来,问题出在调用FOO(x)后的 " ; ".如果不写该分号,看起来不像函数调用,但是写了这个分号。在{}之后就有个分号,把if语句结束了。如果if后面有else,则该else就无法匹配了。(编译报错)