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

New*_*ine 1 c++ namespaces constants magic-numbers

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

Rei*_*ica 5

基本上,您选择此类#define“常量”的唯一原因是预处理器本身是否需要使用它们。除此之外,constexpr过度使用此类#defines有很多好处——它们列在此处

只有当您要在同一个文件中使用幻数时匿名命名空间才是一个很好的解决方案,因为其中的名称永远无法从其他翻译单元访问,因为就编译器而言,未命名命名空间具有唯一标识符。也就是说,将幻数放在匿名命名空间中并没有真正的好处,因为任何命名空间范围内的constconstexpr变量本质上都具有内部链接

对象上下文中const和之间的区别constexpr而言,要点是 while表示编译期间已知的常量值,仅表示编译期间可能不知道的常量值。1这种差异对于编译时编程或在其他常量表达式中的使用至关重要。constexprconst


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
Run Code Online (Sandbox Code Playgroud)

  • Unity 构建是可憎的。 (2认同)