用const定义常量最稳妥,需初始化且支持类型检查和作用域隔离;constexpr适用于编译期常量表达式;避免使用宏,全局const/constexpr变量可安全置于头文件中。

用 const 定义局部或成员常量最稳妥
直接在函数内或类里写 const int MAX_SIZE = 100;,编译器会做类型检查、作用域隔离,还能参与模板推导和 constexpr 优化。比宏安全得多,也比 enum 更灵活(支持浮点、自定义类型等)。
常见错误是忘记初始化:const std::string name; 会编译失败;必须写成 const std::string name = "abc"; 或用构造函数初始化列表(类内)。
注意:非静态成员 const 变量只能在构造函数初始化列表中赋值,不能在构造函数体内用 = 赋值。
constexpr 适合编译期确定的值
如果常量要当数组长度、模板参数或 case 标签用,必须是编译期常量,这时 constexpr 比 const 更严格也更可靠。
例如:constexpr int buf_size() { return 256; } 可以用于 char buf[buf_size()];;而普通 const int x = 256; 不保证能用在需要常量表达式的地方。
容易踩的坑:
-
constexpr函数体必须非常简单(C++11 限制多,C++14 后放宽),含if、for也可能报错 -
constexpr const char*指向的是字符串字面量地址,不是内容;想让内容也进常量表达式,得用std::array<char n></char>或 C++20 的consteval
避免用 #define 定义数值常量
#define PI 3.14159 看似简单,但没类型、不进调试符号、可能被宏展开污染(比如 PI_VALUE 会被误替换成 3.14159_VALUE),还绕过作用域规则。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
唯一合理用法是条件编译:#ifdef DEBUG、#pragma once 这类预处理指令本身。
如果真要兼容旧代码或跨语言头文件,可用 inline constexpr(C++17 起)替代宏,既保持链接唯一性,又保有类型和调试信息。
全局常量该放哪?头文件还是源文件?
定义在头文件里的 const 或 constexpr 变量默认是 internal linkage(只在本编译单元可见),所以可放心写在头文件中,不会导致 ODR(One Definition Rule)冲突。
但若用了 extern const int version; 声明,则必须在某个 .cpp 文件里定义一次,否则链接时报 undefined reference。
性能提示:现代编译器对 static constexpr 和 inline constexpr 都能完全内联,无需担心“多份拷贝”开销;真正要注意的是别把大对象(如 std::vector 初始化列表)塞进头文件,会拖慢编译。
复杂点在于跨模块共享常量对象(比如一个全局配置结构体),这时得权衡是用 inline constexpr Config cfg{...}; 还是单例函数封装——后者更容易控制初始化顺序。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










