一 :对于单纯常量,最好以const对象或者enums替换#define
之前我们常用的定义宏的方式是:
#define ASPECT_RATIO 1.653
这样做潜在的问题是,可能记号名称ASPECT_RATION 在编译器编译源码之前,已经被预处理器移走了,运行时可能获得一个编译错误信息,这个错误信息可能会提示1.653而不是ASPECT_RATION,导致你对1.653来自何处毫无概念。解决方法是使用一个常量替换上述的宏:
const double AspectRatio = 1.653
作为一个常量,AspectRatio肯定会被编译器看到。
另一个值得关注的点是类内的常量。
为了将常量的作用域限制于class内,必须让它成为一个member,为了确保只有一份,必须让它成为一个static成员:
class GamePlayer
{
private:
static const int NumTurns = 5; //常量声明式
int scores[NumTurns];//使用该常量
};
(如果编译器报错找不到定义,需要在cpp文件中提供如下定义)
const int GamePlayer::NumTurns;
声明时已经设置初值了,这里不需要再设置初值。
二:对于形似函数的宏,最好改用inline函数替换#define
我们经常用#define去定义宏,例如:
#define CALL_WITH_MAX(a,b) f((a) >(b)? (a):(b))
对于这样的宏看起来就让人很头疼。
并且调用还会产生意想不到的结果:
int a =5, b=0;
CALL_WITH_MAX(++a, b);//a被累加两次
CALL_WITH_MAX(++a, b+10);//a被累加一次
幸运的是我们有更好的方法替换以上宏:
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a>b? a: b);
}
这个template产出一整群函数。
参考:Effective C++ 中文版