特性 | #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定义函数或类型常量。





Loading Comments...