1. 有些情况下,宁可以编译器替换预处理器,因为#define并不被视为语言的一部分从而导致某些问题.
2. 不带参数的宏展开引起的符号"丢失"问题.
例如,对于"#define ASPECT_RATIO 1.635",编译器在处理源代码之前ASPECT_RATIO就已经被替换为1.635,于是记号名称有可能没有进入记号表(symbol table)内.如果由于运用此常量而获得一个编译错误,错误信息可能会提到1.635而不是ASPECT_RATIO,追踪它将会浪费时间.
解决方案时以一个常量替换上面的宏(#define): const double AspectRatio=1.635;
这可以解决1所提出的问题,此外对于浮点常量(folating point const)而言,使用常量可能比使用#define导致较小量的码,因为它解决了预处理器盲目的将ASPECT_RATIO替换为1.635从而导致目标码出现多份1.635的情况.
种特殊情况值得注意:
第一,对于常量的指针,有必要将其声明为const,例如const double* pta;
第二,如果要将常量的作用域限制在class内,需要让它成为class的一个成员:而为确保此常量至多有一份实体,需将它设为static,例如:
class GamePlayer{ private: static const int NumTurns=5; int scores[NumTurns]; ... };