宏函数看起来像函数,却不会带来函数调用的额外开销,但是宏函数也有其弊端,例如:
#define CALL_MAX_FUN(a, b) fun((a) > (b) ? (a) : (b))
int a = 5, b=0;
CALL_MAX_FUN(++a, b); //a自增2次
CALL_MAX_FUN(++a, b+10); //a自增1次
同样的调用,竟然会因为参数的不同,导致a的结果值不同。
所以尽量使用内联函数来替代宏,内联函数由于其内链接的属性,可以在头文件中定义,并且被多个编译单元引用。另外内联函数也不会带来函数调用的额外开销。另外内联函数是真正的函数,它遵守作用域和访问规则。
template<typename T>
inline void CallMaxFun(const T& a, const T& b)
{
f( a > b ? a : b);
}