| 特性 | #define | const | constexpr | consteval |
|---|---|---|---|---|
| 本质 | 预处理器文本替换 | 运行时常量 | 编译期常量/函数 | 立即函数(必须编译期执行) |
| 类型检查 | ❌ 无类型 | ✅ 有类型 | ✅ 有类型 | ✅ 有类型 |
| 作用域 | 文件作用域(全局) | 遵循C++作用域 | 遵循C++作用域 | 遵循C++作用域 |
| 内存占用 | 无内存地址 | 有内存地址 | 可能优化掉 | 编译期求值,无运行时代码 |
| 调试支持 | ❌ 困难 | ✅ 好 | ✅ 好 | ✅ 好 |
| C++标准 | C++98 | C++98 | C++11 | C++20 |
| 执行时机 | 预处理期 | 运行时初始化 | 编译期计算,运行时也可用 | 必须编译期计算 |
| 是否可修改 | ❌ 不可(预处理后) | ❌ 不可 | ❌ 不可 | ❌ 不可 |
| 模板友好 | ❌ 不友好 | ⚠️ 有限 | ✅ 友好 | ✅ 友好 |
| 函数支持 | 宏函数(不安全) | ❌ 不支持 | ✅ 编译期/运行期函数 | ✅ 必须编译期执行的函数 |
#define:仅用于条件编译、头文件守卫等预处理器功能const:用于运行时常量,接口兼容,简单场景constexpr:现代C++首选,编译期计算,类型安全consteval:C++20+,强制编译期执行,用于必须编译期确定的场景黄金法则:能用 constexpr就不用 const,能用 consteval就不用宏,完全避免用 #define定义函数或类型常量。