宏函数
使用宏函数的优点有两个
- 适用于任何实现了operator<的类型,包括自定义类型;
- 效率最高。虽然使用inline提示符也将函数或模板定义为内联的,但这只是一种提示而已,到底编译器有没有优化还依赖于编译器的实现,而使用宏函数则是完全由代码本身控制。
宏函数是包括在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)其实并不是额外加了什么功能,只是为了保持宏函数实现的时候语意和我们所写的代码一致,防止大括号以及分号的干扰