用静态常量变量替换宏是值得怀疑的

doubtful replace of Macro with Static Const varaible

本文关键字:值得 怀疑 替换 静态 常量 变量      更新时间:2023-10-16

>我想替换

#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。相反,首选组织代码,以便宏的使用驱动一个公共接口的替代实现,然后始终使用该接口。

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