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.
匿名命名空间 是一个很好的解决方案,仅当您要在同一文件中使用 幻数 作为名称时其他翻译单元永远无法访问它的内部,因为就编译器而言,未命名的命名空间具有唯一标识符。也就是说,将 幻数 放在 匿名命名空间 中并没有真正的好处,因为 const
或 constexpr
任何 命名空间范围 inherently have internal linkage.
中的变量
就 const
和 constexpr
之间的区别在 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
我总是使用 #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.
匿名命名空间 是一个很好的解决方案,仅当您要在同一文件中使用 幻数 作为名称时其他翻译单元永远无法访问它的内部,因为就编译器而言,未命名的命名空间具有唯一标识符。也就是说,将 幻数 放在 匿名命名空间 中并没有真正的好处,因为 const
或 constexpr
任何 命名空间范围 inherently have internal linkage.
就 const
和 constexpr
之间的区别在 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