有时会在源码中或在写代码时在宏定义中用到do...while(0)
.
采用这种方式进行宏定义, 主要是为了防止出现以下错误 :
do{}while(0)
-
空的宏定义避免出现warnning.
#define foo() do{}while(0)
-
存在一个独立的操作, 可以进行变量定义, 进行比较复杂的实现.
-
若果出现在判断语句过后的宏, 这样可以作为一个整体来实现.
#define foo(x) action1(); action2();
在以下情况中就会出错 :
if (NULL == pointer) foo(); //在这种情况下就会出现 action1, action2不会被同时执行的情况。
使用do{}while(0)原因
以上三种情况均可以用{}
, 实现,但为什么一定要用do{}while(0).
比如 :
#define switch(x,y) {int tmp; tmp =x; x = y; y = tmp;}
if (x > y)
switch(x,y);
else //出现编译错误,宏引入代码后多一个分号
otherAction();
将宏用do{}while(0)
将宏包裹起来使其成为一个独立的语法单元, 从而不会与上下文发生混淆, 同时大部分编译器能够识别 do{}while(0)
这种无用的循环, 并对其进行优化, 所以使用这种方法不会导致性能的降低.