我总是使用#define
来定义 cpp 文件开头的幻数。我想把它改成const
数字。(在 cpp 文件中声明/定义的全局变量。这是个好主意吗?我应该将它们放入匿名命名空间吗?我从来没有在任何地方#include
cpp 文件。
基本上,选择这种#define
"consts"的唯一原因是预处理器本身是否需要使用它们。除此之外,与使用此类#define
相比,constexpr
有很多优势 - 它们在此处列出。
仅当您要在同一文件中使用幻数时,匿名命名空间才是一个很好的解决方案,因为其中的名称永远无法从其他翻译单元访问,因为就编译器而言,未命名的命名空间具有唯一标识符。也就是说,将幻数放在匿名命名空间中并没有真正的好处,因为任何命名空间范围内的const
或constexpr
变量本质上都具有内部链接。
就对象上下文中const
和constexpr
之间的区别而言,要点是,虽然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
我应该将它们放入匿名命名空间吗?
如果在文件范围内使用,是的,这是有意义的。