函数与带参数的宏
有时程序中有一些包含语句非常少的小操作,如计算两个整数中的较小值。可以将其定义为函数。例如:
int main( int v1,int v2 ) { return ( v1< v2 ? v1: v2 ) ; }
讲这样的小操作定义为函数的优点是:可读性好、易于修改、重用性好。
但缺点是:调用函数有额外的开销,如果频繁调用,会比直接计算慢很多。
解决这个问题的一种办法是 是使用带参数的宏 :
#define MIN( v1,v2 ) v1 < v2 ? v1 : v2
使用宏定义可以避免函数调用的开销,但是宏调用是字符串替换,不会检查参数类型,当表达式作为参数展开式可能会引起计算次序混乱或者多次计算的问题。
次序混乱: MIN( a+b , c ) ==> a+b < c ? a+b :c
多次计算: MIN( a++ , b ) ==> a++ < b ? a++ : b
在C++中inline(内联)函数为上述问题提出了一种解决方案:
若一个函数被定义为inline(内联)函数,则在编译时,它将在函数的每一个调用点“内联地”展开,从而消除了函数调用的额外开销,但是调用内inline函数时依然会(按照函数调用的语义)进行函数参数类型检查,因此比宏调用更加安全。
在函数定义或者声明中的返回值类型前 加关键字 "inline",那就将函数指定为内联的。
inline int min( int v1, int v2 )
{
return ( v1 < v2 ? v1 : v2 );
}
在调用inline函数的源文件中必须有inline函数的定义。所以 inline函数的定义一般放在头文件中,在每个调用该inline函数的源文件中包含该头文件就可以了。