#define宏与const和inline的比较。可以通过下面的两种形式来定义圆周率:
#define PAI 3.1415926 //宏定义
const float pai = 3.1415926 //常变量
在C语言中的宏在编译的时候,编译器只对宏进行简单的替换。在C++中通过const定义一个常变量与C语言中的宏定义相比,常变量具有拥有类型、可调试、可进行参数合法性检查等优点。
下面来看看inline关键字与#define宏的区别:
#define MAX(a, b) a > b ? a :
b
class A
{
public:
inline int getMax(int
a, int b);
…
}
int A::getMax(int a, int b)
{
return a > b ? a : b;
}
首先,为什么要使用宏呢?宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。但是宏容易产生二义性,也不能访问对象的私有成员,这是宏的局限。
对于宏的二义性,来看看下面的例子。从下列选项中选择不会引起二义性的宏定义是:
A、 #indefine POWER(x) x*x
B、 #indefine POWER(x) (x)*(x)
C、 #indefine POWER(x) (x*x)
D、 #indefine POWER(x) ((x)*(x))
分析:
A.#indefine POWER(x) x*x
如果调用POWER(5+6),本意是 (5+6)*(5+6)=121,实际却是:5+6*5+6=41
B.#indefine POWER(x) (x)*(x)
如果调用POWER(5+6)/POWER(5+6),本意是得到结果为1,实际却是:(5+6)*(5+6)/(5+6)*(5+6)=11*11/11*11=121
C.#indefine POWER(x)(x*x)
如果调用POWER(5+6)+POWER(5+6),本意是 (11*11)+(11*11)=121+121=242,实际却是: (5+6*5+6)+(5+6*5+6)=41+41=82
D.没有二义性。
为了利用宏的优点克服宏的不足便引入了inline机制。内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以像调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
加上了inline关键字的函数,编译器将用它的代码直接进行替换。对于那些代码较少而调用频率较高的函数适合用inline关键字,减小了函数在执行时候的堆栈维护开销。
Copyright 2011-2020 © MallocFree. All rights reserved.