条款-02 尽量以 const、enum、inlinen 替换 #define
1-对于单纯常量,最好以 const 对象 或 enums 替换 #defines。
2-对于形似函数的宏(macros),最好改用 inline 函数替换 #defines。
- 在用**#define**进行预处理时:
#define AA 1.653
可能会在记号式调试器(symbolic debugger)中,名称 AA 未进入记号表(symbol table)或者编译器未看见 AA 而产生误差。
解决方法是:利用 const来替换上述的宏(#define):
const double AA = 1.653;
-
当我们以常量替换 #defines时,有两种情况需要说说:常量指针(constant pointers)和 class 专属常量:
-
常量指针:由于常量定义式通常被放在头文件中(以便被不同的源码含入),因此有必要将指针(而不是指针所指之物)声明为 const。
//eg. 若要在头文件内定义一个常量的(不变的) char*-based字符串,必须写两次 const: const char* const AAA = "abcdefg"; //若写成 const string AAA("abcdefg"); //或者 const string AAA = "abcdefg"; //会更好
-
class 专属常量:为了将常量的作用域(scope)限制于class内,必须让它成为class的一个成员(member);而为确保此常量至多只有一份实体,必须让它成为一个static成员:
class GamePlayer { private: static const int Num = 5; //常量声明式 int score[Num] //使用该常量 };
另外,我们无法利用 #define 创建一个 class 专属常量,因为 #define 并不重视作用域(scope)。
-
不用 #define 的实例:(容易乱加)
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b)) //在主函数中: int a=5, b=0; CALL_WITH_MAX(++a,b); //a被累加2次 CALL_WITH_MAX(++a,b+10) //a被累加1次
小结:
有了const、enum 和 inline ,我们对预处理器(特别是 #define)的需求降低了,但并非完全消除。
-