今天在看一段开源代码时,发现里面的宏函数几乎都写成这样:
#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)