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