怀疑用静态Const变量替换宏

时间:2014-04-08 12:52:15

标签: c++ macros static const

我想替换

#define SomeValue ':'

static const uint8_t SomeValue = ':';

我怀疑这个替换,用静态const替换这个宏是否正确?

1 个答案:

答案 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乱丢代码。相反,更喜欢组织代码,以便使用宏来驱动一个公共接口的替代实现,然后在整个过程中使用该接口。

当备选方案是极端复制并粘贴代码片段时,您可能希望(谨慎地)使用宏。