首页 > 解决方案 > C++ - 是否将 const 幻数放入命名空间

问题描述

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

标签: c++namespacesconstantsmagic-numbers

解决方案


基本上,您选择此类#define“常量”的唯一原因是预处理器本身是否需要使用它们。constexpr除此之外,与使用此类s相比,您有一大堆优势#define——它们在此处列出

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

至于和之间的区别在constobjectsconstexpr上下文中,要点是虽然表示编译期间已知的常量值,但仅表示常量值,在编译期间可能不知道。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

推荐阅读