问题
C 语言经常使用如下宏定义一段函数
#define FUN(x) do { \
.... \
} while(0);
这里为何要用 do{ }while (0) 的形式?直接写成下面的样子,不也可以吗?
#define FUN(x) { \
.... \
}
解答
考虑这样一种情况,我们定义宏函数FUN
#define FUN(x) { \
func0();
func1(); \
}
在如下场景使用它
if (true)
FUN(1);
else
func2();
宏展开后,代码变成了
if(true)
{
func0();
func1();
}; //语法错误
else
func2();
展开后多了分号,编译语法错误。
使用 do{ }while(0) 的形式定义FUN
,展开后
if(true)
do {
func0();
func1();
}while(0);
else
func2();
这样就没有语法错误了。
注意 #define 中的 do{} while(0) 后面没有分号,加上分号后,同样在上面的例子中有语法错误