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];
    ...
}; 
    
View Code

相关文章: