“静态 const”与“ const”的 C + + 语义

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

static const int x = 0 ;

还有

const int x = 0 ;

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

94922 次浏览

在文件范围内,C + + 没有区别。const默认使用内部链接,并且所有全局变量都具有静态生存期。但是第一个变体在 C 中具有相同的行为,所以这可能是使用它的一个很好的理由。

在函数中,可以根据参数计算第二个版本。在 C 或 C + + 中,它不必像其他语言要求的那样是一个编译时常量。

在类中,基本上与函数相同。可以在 Ctor-initializer-list中计算实例 const值。在启动初始化期间设置 static const,并在程序的其余部分保持不变。(注意: static成员的代码看起来有点不同,因为声明和初始化是分开的。)

记住,在 C + + 中,const表示 只读,而不是 不变。如果你有一个指向 const的指针,那么程序的其他部分可能会在你不注意的时候改变这个值。如果变量是用 const定义的,那么在初始化之后没有人可以改变它,但是初始化仍然可以是任意复杂的。

const上的 C + + 17标准草案意味着 static在文件范围内

这是在 https://stackoverflow.com/a/3709257/895245上提到的引用

C + + 17 n4659标准草案 6.5“程序和链接”:

3 具有命名空间范围(6.3.6)的名称如果是

  • (3.1)ー明确声明为静态的变量、函数或函数模板; 或,
  • (3.2)ー一个非易失性 const 限定类型的非内联变量,既没有显式声明 extern,也没有 先前宣布具有外部联系的; 或
  • (3.3)ー匿名联盟的数据成员。

附件 C (资料性)兼容性,C.1.2 第6条: “基本概念”给出了从 C 改为 C 的理由:

6.5[亦为10.1.7]

更改: 显式声明为 const 而未显式声明为 extern 的文件范围的名称具有 内部连接,而在 C 语言中有外部连接。

基本原理: 因为 const 对象可以在 C + + 的翻译过程中作为值使用,所以这个特性迫切需要 程序员为每个常量对象提供一个显式的初始值设定项 包含在多个翻译单元中的源文件中的 const 对象。

对原始特征的影响: 明确特征的语义变化。

转换的困难: 语义转换。

使用范围: 很少。

参见: 为什么 const 在 C + + 中意味着内部连接,而在 C 中却没有呢?

您可能希望在标题上执行的操作

详细解释: 常量静态在 C 和 C + + 中是什么意思?

  • Pre C + + 17: 头中的 extern,cpp 文件中的定义
  • Post C + + 17: 标题上的内联变量