const,enum,inline替换#define

const,enum,inline替换#define

多数采纳预管理指令#define的地点都得以应用const,enum也许inline来替换掉它。紧要的缘由有多少个:

#define ASPECT_RATIO 1.653

1.预拍卖指令是在编译前就开展预处理的(gcc
-E举行预管理,它的出口文件作为gcc
-S举行编写翻译的输入),所以编写翻译器是看不到#define定义的标识ASPECT_RATIO
,故它不会产出在符号表中,这样借使编写翻译时期出现了错误它可能只提示常量1.653,如若这些文件又不是你写的,那么调节和测量试验会很困难。

2.选拔常量也许比选拔#define产生更加少的代码,#define举行替换的时候会将ASPECT_RATIO
都替换到1.653,那样在目的代码中会出现三个1.653,然则接纳const就不会有那个主题素材。

依靠上述七个原因应该尽或然在利用#define的时候替换到const,enum,大概inline

使用const替换

假诺急需在五个类中采取一个常量,能够在类钦命义多个static
const的常量来防止接纳#define。static和const那四个根本字可以参照他事他说加以考察此前的那篇博客。

 

class GamePlayer
{
 private:
 static const int intNum=5;//常量声明式
 int scores[intNum];//使用该常量 
};

一旦急需取intNum的地点,还亟需在促成文件中增进:

 

const int GamePlayer::intNum;//定义

倘若那几个常量不是整型的,那么它不能够在类中就赋初值,只可以在贯彻公文中赋初值。然则假若编写翻译器不支持整型在注脚时就钦赐三个初值,能够采取枚举类型来顶替。

使用enum替换

 

class GamePlayer
{
 private:
 enum {NumTurns=5 };
 int scores[NumTurns];//使用枚举类型
};

那样就能够防止选拔的,供给细心的是永不对枚举变量实行取址操作,因为&操作符须求的操作数是左值,而枚举变量是右值,在gcc中采用取址操作时会出现上边包车型地铁编写翻译错误:

 

图片 1

使用inline替换

#define能够用来促成宏:

#define MAX(a,b) ((a)>(b)?(a):(b))

使用宏的裨益是它不会推动函数调用时的开销,但是这么些难题得以由此inline关键字和模板来消除。使用方面包车型客车宏会有五个不可幸免的标题:

int a=5,b=0;

MAX(++a,b);//a被增加三遍

MAX(++a,b+10);//被增多五遍

地点的宏能够透过函数模板来消除那几个题目,它即制止了函数调用的费用,也解决了宏的主题材料:

 

template
inline void max(const T & a,const T & b)//注意这里使用常量引用的形式
{
 return a>b?a:b;
}

 

基本上采取预管理指令#define的地点都足以应用const,enum也许inline来替换掉它。主要的缘由有多少个:
#define ASPECT_RAT…

相关文章