do...while(0)的作用

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

你可能感兴趣的:(fun)