`static const` vs`const`的C ++语义

时间:2010-09-14 13:16:21

标签: c++

在C ++中,具体来说,例如:

之间的语义差异是什么
static const int x = 0 ;

const int x = 0 ;

表示static作为链接和存储类说明符(即函数内部和外部)。

2 个答案:

答案 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++?

  • 在C ++ 17之前的版本:标头中的extern,在cpp文件中的定义
  • 发布C ++ 17:标头上的内联变量