今天在看一段开源代码时,发现里面的宏函数几乎都写成这样:
#define xxx \
do { \
... \
} while(0)
宏中间的代码只会执行一次,为什么要写在do...while(0)循环中呢?
假设一个宏函数定义为:
#define fun() \
fun1(); \
fun2();那么在执行下面这段语句时就会出现问题。if (cas)
fun();fun2()无论在什么情况下都会被执行,这肯定不是我们想要的结果。也许你会认为可以写成这样:
#define fun() \
{ \
fun1(); \
fun2(); \
}但是下面这段代码会编译错误,因为else前面多了一个‘;’
if (cas)
fun();
else
....
而把宏函数的代码写在do...while循环中间就不会出现这个问题了。
#define fun() \
do { \
fun1(); \
fun2(); \
} while(0)
本文探讨了宏函数中使用do...while(0)的原因。通过对比不同宏定义方式,解释了这种方式如何避免代码执行的问题,并确保宏在条件语句中正确使用。
1365

被折叠的 条评论
为什么被折叠?



