C++ - 是否将 const 幻数放入命名空间

C++ - Put const magic numbers into namespace or not

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

Is this a good idea?

是的,因为 #define 有几个问题,例如:

#define SIX 1 + 5
#define NINE 8 + 1

constexpr int the_answer = SIX * NINE; // 42 and not 54

Should I put them into anonymous namespace?

如果在文件范围内使用,是的,它是有意义的。

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

匿名命名空间 是一个很好的解决方案,仅当您要在同一文件中使用 幻数 作为名称时其他翻译单元永远无法访问它的内部,因为就编译器而言,未命名的命名空间具有唯一标识符。也就是说,将 幻数 放在 匿名命名空间 中并没有真正的好处,因为 constconstexpr 任何 命名空间范围 inherently have internal linkage.

中的变量

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


1请注意 const 整数 本身是用常量表达式(例如 整数文字) 作为其声明的一部分隐含地是一个 常量表达式 即使没有显式声明它 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