C++由四个次语言组成:
目标是让编译器来替代预处理器,使用预处理器会存在以下问题:
1. 预处理器只进行简单的替换,变量名称不会被记录符号表,同时可能导致编译的目标文件包含常量的多份拷贝;
#define ASPECT_RATIO 1.653
// 如果没有被记录到符号表,程序遇到编译错误时,输出的错误信息1.653
// 会带来不必要的排查时间
// 替换为
const double AspectRatio = 1.653;
2. 定义字符串的采用string替换char*,避免写两次const的情况出现;
const char* const authorName = "Scott Meyers";
//替换为
const std::string authorName("Scott Meyers");
3. #define没有作用域,不能将常量的作用域限制在class内;
class GamePlayer {
private:
static const int NumTurns = 5; // 常量声明
int scores[NumTurns]; // 使用该常量
}
4. 如果上述类中,编译器不允许在类中设定初值,可以改用枚举值替代;
5.?enum 和 #define定义的对象不会导致非必要的内存分配;
class GamePlayer {
private:
enum { NumTurns = 5 }; // NumTurns 成为5的记号名称
int scores[NumTurns];
}
6. 形似函数的宏,最好用inline函数替换
#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);
}