在C ++中,具体来说,例如:
之间的语义差异是什么static const int x = 0 ;
和
const int x = 0 ;
表示static
作为链接和存储类说明符(即函数内部和外部)。
答案 0 :(得分:116)
在文件范围内,C ++没有区别。 const
使内部链接成为默认值,并且所有全局变量都具有静态生存期。但是第一个变体在C中具有相同的行为,因此这可能是使用它的一个很好的理由。
在一个函数中,第二个版本可以通过参数计算,在C或C ++中它不必像其他一些语言那样需要编译时常量。
在一个类中,与函数基本相同,可以在 ctor-initializer-list 中计算实例const
值。在启动初始化期间设置static const
,并且对于程序的其余部分保持不变。 (注意:static
成员的代码看起来有点不同,因为声明和初始化是分开的。)
请记住,在C ++中,const
表示只读,而不是常量。如果你有一个指针 - const
,那么程序的其他部分可能会在你不看时改变它。如果变量是用const
定义的,那么没有人可以在初始化后更改它,但初始化仍然可以是任意复杂的。
答案 1 :(得分:1)
const
上的C ++ 17标准草案暗示static
在文件范围内
这是在https://stackoverflow.com/a/3709257/895245
中提到的内容的报价。C++17 n4659 standard draft 6.5“程序和链接”:
3 具有名称空间范围(6.3.6)的名称如果是
的名称,则具有内部链接
- (3.1)—显式声明为静态的变量,函数或函数模板;或者,
- (3.2)—既不是显式声明为extern也不是非易失性const限定类型的非内联变量 先前宣布具有外部联系;或
- (3.3)-匿名联合的数据成员。
附录C(信息性)兼容性,C.1.2 第6条:“基本概念”提供了将其从C:更改的理由:
6.5 [也是10.1.7]
更改:显式声明为const而不显式声明为extern的文件范围的名称具有 内部链接,而在C语言中则具有外部链接。
合理性:由于const对象可以在C ++中的转换过程中用作值,因此该功能建议 程序员为每个const对象提供一个显式的初始化程序。该功能允许用户放置 源文件中包含多个翻译单元的const对象。
对原始功能的影响:更改了定义良好的功能的语义。
转换困难:语义转换。
广泛使用:很少。
另请参阅:Why does const imply internal linkage in C++, when it doesn't in C?
您可能想在标题上执行的操作
详细说明:What does 'const static' mean in C and C++?
extern
,在cpp文件中的定义