用静态常量变量替换宏是值得怀疑的
doubtful replace of Macro with Static Const varaible
>我想替换
#define SomeValue ':'
跟
static const uint8_t SomeValue = ':';
我怀疑这种替换,用静态常量替换这个宏是否正确?
来自Scott Meyers Effective C++
第 1 项:首选常量和内联而不是 #define。
此项最好称为"首选编译器而不是预处理器",因为#define
通常被视为不是语言本身的一部分。这是它的问题之一。当你做这样的事情时,
#define ASPECT_RATIO 1.653
编译器可能永远不会看到符号名称ASPECT_RATIO
;在源代码到达编译器之前,预处理器可能会将其删除。因此,名称ASPECT_RATIO
可能不会输入到符号表中。如果在编译过程中遇到涉及使用常量的错误,这可能会令人困惑,因为错误消息可能指的是 1.653,而不是 ASPECT_RATIO
。如果ASPECT_RATIO
是在你没有编写的头文件中定义的,那么你就不知道1.653
来自哪里,你可能会浪费时间追踪它。此问题也可能在符号调试器中出现,因为同样,您正在编程的名称可能不在符号表中。
这种令人遗憾的情况的解决方案简单明了。不要使用预处理器宏,而是定义一个常量:
const double ASPECT_RATIO = 1.653;
同样
来自 Herb Sutter,Andrei Alexandrescu C++编码标准:101 条规则、指南和最佳实践
16.避免宏
宏仍然是一些重要任务的唯一解决方案,例如#include
为条件编译定义的#ifdef
和#if
保护,以及实现断言。
对于条件编译(例如,依赖于系统的部分),请避免在代码中乱扔 #ifdef
s。相反,首选组织代码,以便宏的使用驱动一个公共接口的替代实现,然后始终使用该接口。
当替代方法是极端复制和粘贴代码片段时,您可能希望(谨慎地)使用宏。
相关文章:
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 在线程之间拆分任务总是值得的吗?
- 是否值得对齐变量?
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 是否值得使用位移在单个字节中存储多个小数据成员?
- C :是否值得使用static_cast避免使用数字的条件
- 对位转移行为的怀疑
- 矩阵乘法 - 库达值得吗
- 值得记住素数测试吗?
- 怀疑发送/接收
- 是否值得两次通过文件进行迭代,以创建最小的数据结构
- 对C++指针的怀疑
- 几对性能问题(一个较大的向量与较小的块向量),值得存储迭代索引以进行矢量访问
- 对于基本类型来说值得
- 是否值得只包含type_traits以获取枚举的基础类型
- 在函数中传递只读向量时,冗长真的值得吗?const vector<const string>&
- 为了获得性能而避免多态性值得吗
- 将几行代码写成一行是有益的(就内存和空间复杂性而言)。值得吗?
- 用静态常量变量替换宏是值得怀疑的