别再用 #define 当常量了,你的 C++ 代码可能写得很“脏”
刚在重构一个老项目时差点被编译器报的错搞崩溃,回想起来全是当年被教授带偏的坑。那时候学编程,习惯性地到处用
下一篇
从裸机 Socket 到 HTTP Server →
#define 来定义常量,觉得这玩意儿简单直接,结果在处理复杂的命名空间和类型检查时,简直就是一场调试噩梦。其实在现代 C++ 里,如果你还在用宏定义来搞常量,那真的该反思一下了。宏本质上只是预处理器在编译前做的一场“盲目文本替换”,它根本不认识什么是类型,也不懂什么是作用域。一旦报错,编译器吐出来的错误信息全是替换后的数值,根本找不到你当初定义的那个名字,定位起来极其痛苦。
我现在的原则是:除非是做条件编译,比如针对不同平台切代码,否则绝对不用宏。
如果是那种运行时才能确定的值,比如用户输入后不希望再被修改的变量,我会用 const。它能被纳入类型系统,乖乖遵守作用域规则,至少能保证数据安全。
但真正让我这种追求性能的数据分析逻辑感到“爽”的是 constexpr。这个关键字简直是性能优化的神器,它把计算压力从用户的机器(运行时)直接甩给了编译器(编译时)。
// 以前可能要运行时算,现在编译完直接就是 125
constexpr int calc_cube(int n) { return n n n; }
constexpr int my_cube = calc_cube(5);甚至连函数内部的逻辑分支,我都会尝试用 if constexpr 来做编译时分支判断。这样编译器在生成机器码的时候,直接就把不符合条件的那个分支给“抹掉”了,生成的二进制文件不仅逻辑更干净,运行效率也更高。
最硬核的是,配合 static_assert 使用时,能在编译阶段就把那些逻辑错误直接拦截掉,而不是等程序跑起来、甚至跑了一半才崩掉。
constexpr size_t MAX_SIZE = 10;
// 如果逻辑不对,编译阶段直接报错,根本不用等上线
static_assert(MAX_SIZE > 0, "Size must be positive!");写代码的时候真的得留点心眼,别让这些基础概念的混淆成了未来的技术债。
如果在 promptcube3.com 寻找更多技术逻辑的优化思路,建议多关注这类底层原理的复盘。