【c++八股文】Day3:inline与define与constexpr
✅ inline
vs #define
vs constexpr
总结
特性 / 关键词 | #define | inline | constexpr |
---|---|---|---|
所属阶段 | 预处理阶段 | 编译阶段 | 编译阶段 |
作用对象 | 宏(可替代函数或常量) | 函数(有时用于类内定义) | 常量(或常量表达式函数) |
类型检查 | ❌ 无类型检查 | ✅ 有类型检查 | ✅ 有类型检查 |
安全性 | ❌ 易出错(副作用、优先级) | ✅ 安全(与普通函数等价) | ✅ 安全(编译期常量) |
替换方式 | 文本替换 | 语义替换(函数调用) | 语义替换(常量值) |
调试支持 | ❌ 行号不准确 | ✅ 好调试 | ✅ 好调试 |
是否推荐 | ❌ 不推荐 | ✅ 推荐用于小函数 | ✅ 强烈推荐用于常量表达式 |
多次求值风险 | ✅ 有(比如 x++ 会求多次) | ❌ 没有 | ❌ 没有 |
主要用途 | 旧式宏,定义常量/宏函数 | 小函数内联优化、类内函数 | 定义编译期常量、constexpr函数 |
✅ 举例对比
1. #define
#define PI 3.14159
#define SQUARE(x) ((x) * (x))
问题:
- 没有作用域控制
- 没有类型检查
- 参数可能多次求值导致副作用
2. inline
inline int square(int x) { return x * x; }
优势:
- 类型安全
- 编译器可选择是否展开(非强制)
- 支持函数重载、命名空间、类作用域等现代特性
3. constexpr
constexpr double pi = 3.14159;
constexpr int square(int x) { return x * x; }
优势:
- 支持常量表达式计算
- 类型安全,可用于数组大小、模板参数等场景
- 编译期求值,生成效率高
🧠 总结口诀(便于记忆八股文)
#define 替文本,类型不检易出事;
inline 是函数,检查类型可内联;
constexpr 定常量,编译期算最安全。
现代 C++:弃宏用常量,用函数就 inline。