C++ 用静态常量变量替换宏

C++ 用静态常量变量替换宏,c++,macros,static,constants,C++,Macros,Static,Constants,我想换一个 #define SomeValue ':' 与 我怀疑这个替换为,用static const替换这个宏是否正确

我想换一个

#define SomeValue ':'

我怀疑这个替换为,用static const替换这个宏是否正确第1项:首选常量和内联来定义。

此项最好称为“宁愿使用编译器而不使用预处理器”,因为
#define
通常被视为不是语言本身的一部分。这是它的问题之一。当你这样做的时候

#define ASPECT_RATIO 1.653
编译器可能永远看不到符号名
纵横比
;在源代码到达编译器之前,它可能会被预处理器删除。因此,名称
纵横比
可能无法输入到符号表中。如果在编译过程中遇到涉及常数使用的错误,这可能会令人困惑,因为错误消息可能指的是1.653,而不是
纵横比
。如果在未编写的头文件中定义了
ASPECT\u RATIO
,那么您将不知道
1.653
的来源,并且可能会浪费时间来跟踪它。这个问题也可能出现在符号调试器中,因为您正在编程的名称可能不在符号表中

这个令人遗憾的场景的解决方案简单明了。定义一个常量,而不是使用预处理器宏:

const double ASPECT_RATIO = 1.653;
同理

《草本萨特,Andrei Alexandrescu C++编码标准》101篇,指南和最佳实践

16。避免使用宏

宏仍然是一些重要任务的唯一解决方案,例如为条件编译定义的
#include
保护
#ifdef
#if
以及实现断言

对于条件编译(例如,依赖于系统的部分),避免将代码与
#ifdef
s混在一起。相反,更喜欢组织代码,以便宏的使用驱动一个公共接口的替代实现,然后在整个过程中使用该接口


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

为什么不使用
char
?而且我认为你不需要静态的
。宏是邪恶的,但并不总是如此。但在你的情况下,不要使用宏。这取决于周围环境。当从宏更改为静态常量时,我有时会遇到多个定义的错误,但这取决于它的使用方式。还有类型安全性,您总是能够确定所使用的内容(就类型检查而言)
const double ASPECT_RATIO = 1.653;