我想替换
#define SomeValue ':'
带
static const uint8_t SomeValue = ':';
我怀疑这个替换,用静态const替换这个宏是否正确?
答案 0 :(得分:2)
来自 Scott Meyers Effective C ++
第1项:首选const和内联到#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
乱丢代码。相反,更喜欢组织代码,以便使用宏来驱动一个公共接口的替代实现,然后在整个过程中使用该接口。
当备选方案是极端复制并粘贴代码片段时,您可能希望(谨慎地)使用宏。