我正在使用C ++进行编码,我想知道定义const变量的最佳方法。
据我了解,如果我想在cpp文件中定义一个const变量,我们可以像以前这样编码:const static int LEN = 5;
现在,C ++建议我们使用匿名命名空间:namespace { const int LEN = 5; }
我不知道如何在头文件中正确定义const变量。
我在一些头文件中看到了一些代码,如下所示:
const int LEN = 5;
这是最好的方法吗?为什么不在头文件中编码const static int LEN = 5;
?
答案 0 :(得分:1)
我正在使用C ++进行编码,我想知道定义const变量的最佳方法。
没有“最佳方法”。这取决于。
顺便说一句,听说过constexpr
吗?
据我了解,如果我想在cpp文件中定义一个const变量,我们可以在之前进行如下编码:
const static int LEN = 5;
是的,我们可以。
请注意,使用static
关键字声明的名称空间范围内的事物具有内部链接。
还请注意,我不是称LEN
为“静态变量”。
现在C ++建议我们使用匿名名称空间:
namespace { const int LEN = 5; }
在匿名名称空间中声明的所有内容均具有内部链接。但是我不认为C ++本身会提出任何建议。
我在一些头文件中看到了一些代码,如下所示:
const int LEN = 5;
C ++有一项特殊规定,即使没有static
说明符,默认情况下,使以名称空间为范围的const限定变量具有内部链接。
请参阅:https://en.cppreference.com/w/cpp/language/storage_duration#Linkage
请注意,它与C不同。
还请注意,这并不意味着“ const
包括static
”。用这种方式思考会令人困惑。
我们为什么不在头文件中编码
const static int LEN = 5;
?
实际上,我们可以。由于非技术原因,它甚至可能是有益的。如果您认为阅读您的代码的听众不知道该特殊规定,则static
指定者将向听众清楚该变量具有内部链接。
答案 1 :(得分:-2)
1。如果多个CPP文件包含标头,则标头中的定义变量可能会导致多个定义。
2.Static限定符将使const变量成为“ local”,因此在#include“ .h”时创建了一个新实例。名称空间{}做同样的事情。
3。就像@Ant所说的那样,C ++中const已经包含static,因此不会发生多定义错误。