在我们看内核源码或者库以及一些优秀的源码时,都会发现他们的宏函数是包括在do{…}while(0)内。具体的原因其实想想就能明白。
考虑下面一个特殊的例子。
宏函数的定义如下:
#define test(x) \
a(x); \
b(x);
如果在调用时是这样调用的:
if (judge)
test(x);
那么展开之后就是:
if (judge):
a(x);
b(x);
这时产生的效果可能就和你的本意不同了,因为b(x)无论怎样都会执行。
这是由于大括号产生的问题,那如果我们简单的给宏函数加上大括号而不用do{…}while(0)可以吗?
举例如下:
#define test(x)\
{ \
a(x);\
b(x);\
}
调用时:
if (judge)
test(x);
展开之后:
if (judge)
{
a(x);
b(x);
};
这个时候就产生语法错误了,因为多了一个分号。
总结:宏函数加do{…}while(0)其实并不是额外加了什么功能,只是为了保持宏函数实现的时候语意和我们所写的代码一致,防止大括号以及分号的干扰。