目录
1.#define出错不好定位
#define ASPECT_RATIO 1.653
因为#define只是在预处理的时候进行宏替换,不会进入符号表,所以编译器压根不知道 ASPECT_RATIO,当你获得一个错误信息的时候他可能会提到 1.653,不会提到 ASPECT_RATIO,如果这个宏不是你自己定义的,你还要花费时间去追踪这个宏在哪个文件定义的。
2.使用cosnt代替#define的注意事项
2.1定义const指针
const char* const p = "hello"
定义const指针时,别忘了指针指向的内容也是不可更改的,所以要在*号的后面加个const。
2.2定义类的专属常量
class player
{
private:
static const int NumTurns = 5;
int scores[NumTurns];
};
首先#define不提供任何的封装所以无法作为类的专属变量。
在定义 static const int NumTurns = 5; 时如果你的编译不支持在类内进行初始化,可以使用匿名枚举(enum hack)或者 类内定义类外初始化。
class player
{
private:
static const int NumTurns;
int scores[NumTurns];
};
const int player::NumTurns = 5;
// 匿名枚举
class player
{
private:
enum {NumTurns = 5};
int scores[NumTurns];
};
3.对比

4.使用inline和模板替换宏函数
使用宏函数的主要目的就是减小栈的开销,但是宏函数的带来的问题太多了。
template<class T>
inline const T add(const T& a,const T &b)
{
return a + b;
}
add他是一个真正的函数,会有参数类型的检查,会在调用处展开同样也不会有栈帧的开销。

被折叠的 条评论
为什么被折叠?



