#define ASPECT_RATIO 1.653
基础知识:
(1)宏定义#define NAME Value 是预处理器处理,编译器无法看到NAME,没有进入记号表(symbol table)中。
存在问题:
(1)当运用该常量获得一个编译错误信息时,由于ASPECT_RATIO不在symbol table中,那么编译错误提示1.653而不是ASPECT_RATIO。如果ASPECT_RATIO被定义在一个非你写的头文件内,你将为追踪它而花费时间。
(2)产生过多的目标代码(object code),因为预处理器会将所有ASPECT_RATIO都替换为1.653
(3)宏函数虽然简便,不会导致函数调用带来的开销,但容易误用
解决方法:
(1)使用常量替换宏
const double AspectRatio = 1.653
(2)对于class 专属常量,为了将常量的作用域限定在class内,那么它既要是class的一个成员,又要保证此常量至多只有一份实体,可以使用静态成员:
static const int Count = 5;
或:
enum {Count = 5};
(3)对于宏函数,使用inline函数替换
#define CALL_WITH_MAX(a., b) f((a) > (b) ? (a) : (b))
替换为
template<typename T>
inline void callWithMax(const T&a, const T&b)
{
f(a > b ? a : b);
}
这样做的好处:
a. 不需要考虑为函数参数加上过多的括号
b. 不用担心参数被计算多次(如宏函数中a++)
c. 可以控制作用域和访问规则(比如该函数可以是class 成员函数)
注意:
对于字符串常量一般写为
const string authorName("Scott Meyers");
而不写成(避免多个const)
const char *const authorName = "Scott Meyers";