我想使用一个简单的编译时常量,例如:
double foo(double x) { return x + kConstDouble; }
Run Code Online (Sandbox Code Playgroud)
现在我至少看到以下定义该常量的方法
namespace { static constexpr double kConstDouble = 5.0; }
namespace { constexpr double kConstDouble = 5.0; }
static constexpr double kConstDouble = 5.0;
constexpr double kConstDouble = 5.0;
Run Code Online (Sandbox Code Playgroud)
哪种方式正确?kConstDouble在标题与源文件中定义时是否存在差异?
使用静态或匿名命名空间将导致变量具有内部链接;它仅在同一翻译单元内可见。因此,如果您在 .cpp 文件中使用其中之一,您将无法在其他任何地方使用该变量。如果常量是该代码单元的实现细节,通常会这样做。如果您想将其公开给其他翻译单元,则需要将其放入头文件中。典型的方法是将其声明为静态(或将其放入匿名命名空间中),因为它是一个简单的常量变量。另一种方法是在标头中声明它 extern,并在 .cpp 中定义它以获得真正的全局变量(与顶部变量相反,实际上每个 tu 都有自己的副本)。
静态和匿名命名空间之间;好吧,首先你不需要两者。AFAIK 他们都做同样的事情。但我认为此时在 cpp 文件中使用匿名命名空间更为惯用,因为它们还可以用于提供函数、类等内部链接。另一方面,当您想使用它使变量全局可用时,更常见的是使用 static;我从不在头文件中使用匿名名称空间,因为我发现它具有误导性。