gpt4 book ai didi

c++ - 怀疑用静态常量变量替换宏

转载 作者:行者123 更新时间:2023-11-30 04:06:22 27 4
gpt4 key购买 nike

我要替换

#define SomeValue ':'

static const uint8_t SomeValue = ':';

我对这个replace-with表示怀疑,用static const替换这个宏是否正确?

最佳答案

来自 Scott Meyers Effective 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,并实现断言。

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

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

关于c++ - 怀疑用静态常量变量替换宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22937662/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com