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)则保证了循环只会执行一次。


本文部分内容来源网络