#define ASPECT_RATIO 1.653
define 的问题在于:程序在编译前先进行预处理,直接将ASPECT_RATIO替换,在出现错误异常时对预处理的定位会浪费时间。
解决方法:
1.利用常量替换宏,const double AspectRatio = 1.653
在定义常量指针时,需要此形式: const char* const authorName = "xujian"
2.对于类内部的专属常量,可定义为静态成员
</pre> ..<pre name="code" class="cpp">class GamePlayer{
private:
static const int NumTurns = 5; //常量声明
int scores[NumTurns];
}
注意:在.H文件中,用static 关键字进行前缀修饰即可,不可以直接进行初始化,基础变量除外。如果要初始化自定义的类型,则需要在CPP文件中进行初始化
3.在CPP文件进行初始化后编译器无法支持如上代码所示的数组声明式。此时可用枚举代替:
class GamePlayer{
private:
enum { NumTurns = 5}
int scores[NumTurns];
}
枚举类似于宏定义,无法获取地址。
4.对于函数调用
#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);
}
结论:可以在适当的场合进行替换,但无法完全取代预定义,#ifdef/#ifndef依然扮演重要的角色。