首先#define有很大的好处:
1. 首先谈一下在C中使用这种形式宏定义的原因,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成 等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。
2. 这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。
然而#define定义函数时是有个很大的缺陷:
#define用参数时,是严格的替换策略。无论你得参数时何种形式,在展开代码中都是用形参替换实参。
和 #define 宏不同的是,内联函数总是对参数只精确地进行一次求值,从而避免了那声名狼藉的宏错误。换句话说,调用内联函数和调用正规函数是等价的。
下面这段代码就很明显看出两者的差距:
#include <iostream>
using namespace std ;
#define Max( a , b ) ( a > b ? a : b ) ;
inline int fun( int a , int b )
{
return ( a > b ? a : b ) ;
}
int main()
{
int a , b ;
a = 3 ;
b = 0 ;
Max( ++a , b ) ;
cout << a << endl ;
a = 3 ;
b = 5 ;
Max( ++a , b ) ;
cout << a << endl ;
a = 3 ;
b = 0 ;
fun( ++a , b ) ;
cout << a << endl ;
return 0 ;
}
输出为:
5
4
4
唔。。。。。。郁闷。。。。。。我想Max( ++a , b ) ;那绝对不是你想要得到的结果。
原因就是,哎我想你猜也能猜出来了。
万一你要是还不知道,你就去看看effective c++ 吧。我真的懒得在费口舌了。
inline函数和用macro定义的函数区别
macro定义
只是很初级的一种代换,实现的功能很单一
而且安全性很差,比如类型错误、括号漏写
都会造成很大的错误,
而且错误不容易被发现,隐患很大
inline函数
内联函数要比前者好很多
功能也要全面很多!
最主要的是
内联函数能够进行安全检查(比如参数类型 等)
如果在能够使用两着的情况之下
推荐使用 内联
不过有两点要注意:
1 内联 是以代码膨胀为代价的,
不是所有的函数都适合用 内联 方式
要考虑函数的实际情况
2 macro定义 也不是说一无是处了
在合适的时候使用 也许会有意想不到的效果