【问题标题】:doubtful replace of Macro with Static Const varaible怀疑用静态常量变量替换宏
【发布时间】:2014-04-08 12:52:14
【问题描述】:

我想换

#define SomeValue ':'

static const uint8_t SomeValue = ':';

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

【问题讨论】:

  • 为什么不是char?而且我认为您不需要static
  • 看是对的
  • 是的。宏是邪恶的,但并非总是如此。但在你的情况下,不要使用宏。
  • 视环境而定。从 Macro 更改为 static const 时,我有时会遇到多个定义的错误,但这取决于它的使用方式。

标签: c++ macros static constants


【解决方案1】:

来自 Scott Meyers 有效的 C++

第 1 项:使用 const 和 inline 优于 #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,以及实现断言。

对于条件编译(例如,与系统相关的部分),请避免在代码中乱扔#ifdefs。相反,更喜欢组织代码,以便使用宏驱动一个通用接口的替代实现,然后在整个过程中使用该接口。

当替代方案是极端复制和粘贴代码的 sn-ps 时,您可能希望(谨慎地)使用宏。

【讨论】:

  • 而且类型安全,你总是可以确定你在使用什么(就类型检查而言)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多