C ++-将const幻数放到命名空间中

时间:2018-09-20 14:07:35

标签: c++ namespaces const magic-numbers

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

2 个答案:

答案 0 :(得分:4)

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

匿名命名空间仅在您要在同一文件中使用幻数时才是一个好的解决方案,因为其中的名称永远无法通过其他翻译访问就编译器而言,未命名的名称空间具有唯一的标识符,因此它们是单位。就是说,将幻数放在匿名命名空间中并没有真正的收获,因为任何const或constexpr变量>命名空间范围 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

答案 1 :(得分:3)

  

这是个好主意吗?

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

#define
  

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

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