自从工作以来偶尔会在代码里见到一些do{}while(0)形式的宏定义,但是当初并不知道这样做的目的是什么,总觉得单单用一下{}就可以实现相同的功能了。 最近在看linux内核源码,里面有一堆do{}while(0)的宏,于是查了一下,发现有的情况只能用do{}while(0)的形式来定义宏,用单纯的{}会导致报错。 实验代码如下:
#include <stdio.h>
#define MACRO_DO_WHILE_ZERO(enable, fmt, args...)do { if (enable) \
printf(fmt, ##args); \
} while(0)
int main(int argc, char **argv)
{
if(1)
MACRO_DO_WHILE_ZERO(1, "%s\n", "true print");
else
MACRO_DO_WHILE_ZERO(1, "%s\n", "false print");
return 0;
}
在这种情况下,用do{}while(0)的宏可以编译通过。
#include <stdio.h>
#define MACRO_BRACE_ONLY(enable, fmt, args...){ if (enable) \
printf(fmt, ##args); \
}
int main(int argc, char **argv)
{
if(1)
MACRO_BRACE_ONLY(1, "%s\n", "true print");
else
MACRO_BRACE_ONLY(1, "%s\n", "false print");
return 0;
}
这种情况下编译会报错:
|