查缺补漏——define和inline

xiaoxiao2021-02-28  102

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

 

 

转载请注明原文地址: https://www.6miu.com/read-39752.html

最新回复(0)