不使用 do while(0)
#define MY_MACRO(x) \
printf("Hello "); \
printf("%d", x);
如果有 if 判断代码
if (x)
MY_MACRO(x)
那么宏展开后就是
if (x)
printf("Hello ");
printf("%d", x);
第二个语句并没有在 if 成立时执行
上述问题可以用 {}
解决
#define MY_MACRO(x) {
\
printf("Hello "); \
printf("%d", x); \
}
if (a)
MY_MACRO(a);
else
MY_MACRO(b);
那宏展开后就是
if (a)
{
printf("Hello ");
printf("%d", x);
};
else
MY_MACRO(b);
在if-else 语句中 };
这种结构是会报错的
使用 do while(0) 结构
#define MY_MACRO(x) do {
\
printf("Hello "); \
printf("%d", x); \
} while(0)
完美解决上述问题
if (a)
do
{
printf("Hello ");
printf("%d", x);
} while (0);
else
do
{
printf("Hello ");
printf("%d", x);
} while (0);