1. 结论
- 对于单纯常量,最好以 const 对象或者 enum 替换 #define 。
- 对于形似函数的宏 (function-like marco),最好用 inline 函数替换 #define 。
2. #define
#define ASPECT_RATIO = 1.653
- 编译器没有将这个名称存入到调试器的记号表(symbol table)中,无法追踪,不利于调试。
- 在程序中存在多份拷贝。
3. const & enum
const double AspectRatio = 1.653;
用常量替换 #define 的两种特殊情况
3.1 定义指针常量
有必要将指针定义为常量指针(指针本身为常量),并且还要所指对象也是常量,即 const char* const musicName = "So Cold"。
当然我们更推荐使用 string 。const std::string musicName("So Cold");
3.2 class专属常量(加static)
class里面是常量声明式,定义式放在实现文件里。
3.3 特殊情况
如果不允许对类内常量静态数据成员,在类内进行初始化,但是我们又必须在编译期间知道该成员的值。这时我们可以使用枚举类型充当 int 使用。叫 enum hack。
class GamePlayer {
private:
enum { NumTurns = 5 };
int scores[NumTurns];
};
4. inline
对于类函数的宏 (function-like marco),最好用 inline 函数替换 #define 。