#define ASPECT_RATION 1.653
存在的问题:#define所定义的名称可能没有进入symbol table。
解决方法:用const替换#define
const double AspectRatio = 1.653;
以const替换#define的两种特殊情况:
1. 定义常量指针(constant pointers)
由于常量定义通常被放在*.h文件内,因此有必要将指针本身(而不是指针所指的内容)声明为const。例如要在头文件定义一个constant char*-based字符串,你必须写const两次:
const char* const authorName = "Scott Meyers";
Item 03提示:string对象比char*-based要好。
const string authorName("Scott Meyers");
2. class专属常量
为了使常量为class专属的,必须将它声明为class的一个member;而为确保此常量只有一份实体,则必须将它声明为static member:
class GamePlayer {
private:
static const int NumTurns; // 此处为常量声明式,而不是定义式
int scores[NumTurns]; // 使用该常量
};
const int NumTurns = 5; // static const常量定义,位于实现文件
#define并不能创建一个class的专属常量,由于#define并不重视作用域。一旦#define被定义,它就在其后的编译过程都有效(除非遇到#undef)。这意味着#define破坏了面向对象的封装性,const则可以被封装。
例外:当在编译期间需要一个class常量时(如上中scores数组大小),这时可以使用枚举类型:
class GamePlayer {
private:
enum {NumTurns = 5};
int scores[NumTurns];
};
enum hack是template metaprogramming的技术。
#define CALL_WITH_MAX(a, b) f((a) > (b)) ? (a) : (b)
使用template inline代替:
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a > b ? a : b);
}
总结:
对于单纯常量,最好以const或者enum替换#define;
对于函数的宏,最好以inline函数替换#define。