🔎

define、const、constexpr、consteval 的区别与联系

特性
#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定义函数或类型常量。
你觉得这篇文章怎么样?
YYDS
比心
加油
菜狗
views

Loading Comments...