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



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

基本上,选择这种#define"consts"的唯一原因是预处理器本身是否需要使用它们。除此之外,与使用此类#define相比,constexpr有很多优势 - 它们在此处列出。

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

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


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

这是个好主意吗?

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

#define SIX 1 + 5
#define NINE 8 + 1
constexpr int the_answer = SIX * NINE; // 42 and not 54

我应该将它们放入匿名命名空间吗?

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

相关内容

  • 没有找到相关文章

最新更新