查缺补漏——define和inline

首先#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
定义   也不是说一无是处了
 
     
在合适的时候使用   也许会有意想不到的效果 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值