条款2:尽量用const,enum,inline 对#define进行替换
案例一:
#define ASPECT_RATIO 1.653
这种预定义宏,并未进入符号表,只是符号替换,更别提错误检查!非常不安全!
替换方法: const double Aspect_Ratio = 1.653
这种定义const常量,会进入符号表,会进行错误检查,会分配内存
案例二:类内部使用的常量
//Game.h文件中
class Game
{
private:
static const int NumTurns = 5; //常量声明式
int scores[NumTurns];
}
//低版本编译器需要加,高版本编译器甚至不需要
//Game.cpp文件中
const int Game::NumTurns ; //定义
//假设上述int scores[NumTurns]; 低版本编译器不允许这样设定
替代方案如下,俗称enum hack惯用法
class Game
{
private:
enum { NumTurns = 5 } ; //俗称 enum hack
int scores[NumTurns];
}
案例三: 使用inline+模板的形式避免一些常用的宏函数
例如:以a和b的最大值调用f
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
当此时我们使用一下代码,会出现不可思议的事!!
int a = 5 , b= 0;
CALL_WITH_MAX(++a,b);
结果: a在第一个调用被累加两次
为了避免这样的情况,怎么做呢?
如下:
template<typename T>
inline void callWithMax(const T& a,const T& b)
{
f(a > b ? a : b);
}
通过内联和函数模板,往往我们可以取代这些简短宏函数,来保证安全性!
总结:
1、用enums 和 const 替换#define
2、用inline和函数模板替换宏函数