do...while(0) in C/C++ Marco
Published: Mar. 09, 2017
do…while(0) 是C和C++中宏定义函数常见的形式,一般是循环区域内是函数体,
#define testPrint(a)
do {print(a);} while (0)
这样的写法目的只有一个,保证宏定义函数执行的正确性,即使用do{…}while(0)构造后的宏定义总是会按你期望的方式调用运行,不会受到大括号、分号等的影响。
下面的例子应该是经典了,很多人都用:
#define num(x) one(x); two(x)
然后调用这个宏定义的时候
num(me)
就会被替换成
one(me);two(me)
到这里都没有问题
但是,如果这样的if else调用的话就会有问题
if(!cond)
num(me);
这样扩展后就变成
if(!cond)
one(me);
two(me);
这很明显就不对了。
用大括号括起来也不能万无一失
#define num(me) {one(me);two(me)}
如果在这样的代码中,就会出现问题
if(!cond)
num(me);
else
wtf(me);
扩展之后就变成了
if(!cond) {
one(me);
two(me);
};
else
wtf(me);
用do…while(0),在大部分情况下,都可以正确使用宏定义
do循环强制执行,while(0)则保证了循环只会执行一次。
本文部分内容来源网络