#define不被视为语言的一部分,这正是问题所在。
例如:
#define ASPECT_RATIO 1.653
记号名称也许从未被编译器看见,也许在编译器开始处理源码之前它就被预处理器移走了。因此,它可能没被记入记号表内。
解决方法:
用一个常量替换上面的宏(#define)
const double AspectRatio = 1.63;
作为一个常量,肯定会被编译器看到,因此,会记入记号表中。此外,使用常量可能比#define导致更小量的码,因为预处理器“盲目将宏名称替换为1.63”可能导致目标码出现多份1.63。
常量替换#define两点注意:
- 定义常量指针:
const char *authorName = “Shenzi”;
cosnt std::string authorName("Shenzi");
- 类专属常量:
static const int NumTurns = 5;//static 静态常量 所有的对象只有一份拷贝。
取一个const的地址是合法的,但取一个enum的地址就不合法,而取一个#define的地址通常也不合法。如果你不想让别人获取一个pointer或reference指向你的某个整数常量,enum可以帮助你实现这个约束。
例:
#define CALL_WITH_MAX(a,b) f((a) > (b)) ? (a) : (b))
用模板替换:
template<typename T>
inline void callWithMax(cosnt T &a, cosnt T &b)
{
f(a > b ? a : b);
}
请记住:
- 对于单纯常量,最好以const对象或enums替换#defines;
- 对于形似函数的宏,最好改用inline函数替换#defines。