Fork me on GitHub

尽量以const,enum,inline替换#define

1、无参宏定义的缺点

  ① 可能会导致编译错误

    记号名称也许从未被编译器看见

    也许编译器在开始处理源码之前,记号名称被预处­理各移走,于是记号名称未进入记号表。

  ② #define 可能会比使用 const 导致更多的码。

  ③ #define 无法创建一个class专属常量,因为#define 并不重视作用域 cope,

    #define 无法定义有封装性的变量,而const可以。

2. const 定义 class 专属常量  

  ① 为了将常量的作用域限制于 class 内,必须让它成为 class 的一个成员(member)   

    为了保证常量只有一份实体,必须让它成为 static成员,

  ② 有一种情况无须为 class静态成员常量提供定义式,

    该常量为整数类型,且不取其地址。

    为了使用一般编译器,强烈建设提供定义式!

1 class GamePlayer {
2 private:
3     static const int NumTurns = 5;    //静态成员常量的声明式
4     ...
5 };
6 
7 const int NumTurns;                   //静态成员常量的定义式

③ 若编译器不让 static 成员在其声明式上获初值,(in-class初值设定)

  你可以将初值放在定义式.

④ 若编译器不让 static 成员在其声明式上获初值,而你想在

  class编译期间需要一个 class 的常量值,

  可使用 "The enum hack",其理论基础为:一个属于枚举

类型约数值可权充 ints 使用, 

1 class GamePlayer {
2 private:
3     enum {NumTurns = 5};
4     int scores[NumTurns];
5     ...
6 }; 

⑤ 用 enum hack 俩个好处,

  enum hack可以阻止用户获得常量的 pointer 或 reference.

  enum和#define 一样绝不会导致非必要的内存分配,

3、有参宏定义

  有参宏定义可以用template inline代替

 

posted @ 2020-03-19 20:34  最后的战役aag  阅读(174)  评论(0编辑  收藏  举报