C++ - 是否将 const 魔数(Magic Number)放入命名空间

标签 c++ namespaces constants magic-numbers

我总是使用 #define 在 cpp 文件开头的某处定义魔数(Magic Number)。我想将其更改为 const 数字。 (在 cpp 文件中声明/定义的全局变量。)这是个好主意吗?我应该将它们放入匿名命名空间吗?我从不在任何地方#include cpp 文件。

最佳答案

基本上你选择这样的#define“consts”的唯一原因是预处理器本身是否需要使用它们。除此之外,constexpr 比使用这样的 #define 有一大堆优势——它们是 listed here .

匿名命名空间 仅当您要在同一个文件中使用魔数(Magic Number) 时才是一个很好的解决方案,因为其中的名称永远无法从其他翻译中访问单位,因为就编译器而言,未命名的命名空间具有唯一的标识符。也就是说,将魔数(Magic Number)放在匿名命名空间中并没有真正的好处,无论是const还是constexpr 任何命名空间范围 中的变量 inherently have internal linkage .

至于 constconstexpr 之间在 objects 上下文中的区别,要点是虽然 constexpr 表示在编译期间已知的常量值,const 仅表示在编译期间可能不知道的常量值。1 这种区别对于编译时编程至关重要,或用于其他 constant expressions .


1请注意,const integral 本身是用常量表达式(例如 整数文字) 作为其声明的一部分隐含地是一个常量表达式,即使没有显式声明它 constexpr:

const int A = 50; // `A` is a constant expression

int n = 50;
const int B = n; // `B` is not a constant expression as it-
                 // is not being initialized with a constant expression

关于C++ - 是否将 const 魔数(Magic Number)放入命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52427075/

相关文章:

c++ - 使用 LD_PRELOAD 和 dlsym() 覆盖 'free' 或 'delete'

haskell - 如何处理带有限定名称的丑陋中缀符号

class - 在 Fortran 中将模块分解为多个文件

c++ - 如何初始化静态常量 vector

function - Function.const 的目的是什么?

python - 不变的变量,即使它发生变化

c++ - 将 .ui 文件添加到 QT 中的现有类

c++ - DirectShow 解码器减少媒体时间

c++ - 在 Qt 应用程序中缓慢淡入和淡出

r - 为什么调用指定命名空间的函数会更慢?