最近在github上翻别人的代码来看。
看见某些宏定义中,使用了do{…}while(0)的形式,就很纳闷,这不是多此一举吗。然后搜索引擎查了一下,发现竟然是个很有用的东西。
如果我们这样子定义一个宏
#define func(x) func1(x);func2(x)
然后这样子调用
if(condition) func(a);
然后就会发现他变成了
if(condition) func1(a); func2(a);
这样子就不是我们想要的方式了。
那外面加个大括号呢?例如
#define func(x) {func1(x);func2(x);}
也不行,会变成
if(condition) { func1(a); func2(a); };
所以为了让使用这段宏的其他人(如果只有我们自己当然无所谓),能准确无误地使用,能像个函数一样使用,在宏定义时可以使用do{…}while(0)的形式。
比如
#define func(x) do{func1(x);func2(x);}while(0)
展开后
if(condition) do { func1(a); func2(a); }while(0);
这样子就没问题了