宁可以编译器替换预处理器。
#define MAX 1.623
MAX 可能从未被编译器看见,编译器在处理之前预处理器就将MAX移走,只能看到1.623, 当运用这个常量并且出现错误时,错误信息就只会提到1.623。用
const double Max = 1.623
就不会出现这种问题。Max肯定会进入符号表。
常量作为类的成员时,将其申明为static将其作用域限制于class中
class Gameplayer{
private:
static const int NumTurns = 10; //声明式
int scores[NumTurns];
};
const int Gameplayer::Numturns; //如果编译器需要定义式
常量Numturns的作用域在类中,如果用#define编译后都会替换。除非用#undef。
用enum
class Gameplayer{
private:
enum{NumTurns = 5};
int scores[NumTurns];
};
相比较const,enum的作用更像#define. const 定义的常量可以取地址,而enum不可以。虽然好的编译器不会为const设定另外的储存空间,而enum绝对不会。
宏函数
#define MAX(a,b) f((a)>(n)?(a):(b))
只是做替换(如果不加括号很容易出错)
int a =1, b =2;
MAX (++a,b); //a替换后被++两次,实际只是想++一次
用内联函数
template <class T>
inline void callMax(const T& num1, const T& num2)
{
f(a>b?a:b);
}