条款01:视C++为一个语言联邦
Q. C++联邦由哪些次语言构成?
C:基础语法
面向对象:类、封装、继承、多态、虚函数等
模板:泛型编程和模板元编程(TMP)
STL:标准模板库,包含容器、迭代器、算法和函数对象的设计模式
Q. 为什么要视为语言联邦?
为了不同的子语言使用不同的编程习惯。
条款02:尽量以 const、enum、inline 替换 #define
备注:C11 之后 constexpr 更加强化了这一思想
Q. 为什么不建议在 C++ 中使用 #define 定义常量?
#define不做类型检查,宏展开可能导致难以发现的错误。而const、enum、inline 是类型安全的。
预处理后,代码中所有 宏名 都变成了 值 ,符号表没有宏名,调试器只会看到常量值,看不到宏名,调试时遇到报错只看到值很难定位。
Q. 推荐做法
- enum是编译期常量不占内存(编译期常量在编译阶段就已知具体数值,编译器会把它直接写到指令中(代码段),不用再存内存变量; 而运行期常量,必须在运行时算出来并存到数据段)
- 宏函数应全部替换为
inline或constexpr函数。 - 常量应首选
constexpr(支持编译期计算)或inline constexpr(跨文件共享) - 宏定义的最佳实践是只在条件编译、平台特定代码中用宏(如
#ifdef _WIN32)
