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

Cli*_*ord 136 c++

特别是在C++中,例如:语义差异是什么:

static const int x = 0 ;
Run Code Online (Sandbox Code Playgroud)

const int x = 0 ;
Run Code Online (Sandbox Code Playgroud)

两者static作为键和存储类说明(即内部和功能外).

Ben*_*igt 119

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

在函数中,第二个版本可以从参数计算,在C或C++中,它不必像其他语言一样需要编译时常量.

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

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

  • 短语"const表示只读,不是常数"的+1,即"编译器,如果你看到有人试图修改这个常量的东西,那就大声咆哮." 这就是为什么某些东西可能同时变得不稳定. (8认同)
  • 它更像是"编译器,如果你看到我试图修改这个常量的东西(或给别人许可这样做)",那么大声咆哮.在大多数情况下,`const`适用于变量的视图而不是变量本身,其他人可以拥有相同变量的非`constst'视图,并且编译器在修改它时会非常安静. (5认同)
  • 我建议 *file scope* 是链接器而不是编译器的人工制品,因此在语言标准中可能不会受到太多关注。严格来说,它可能是“编译单元范围”。 (2认同)

Cir*_*四事件 7

C++17 标准草案const隐含static在文件范围内

这是引用的内容:https : //stackoverflow.com/a/3709257/895245

C++17 n4659标准草案6.5《程序与联动》:

3 具有命名空间范围 (6.3.6) 的名称具有内部链接,如果它是

  • (3.1) — 显式声明为静态的变量、函数或函数模板;或者,
  • (3.2) — 非 volatile 常量限定类型的非内联变量,既未显式声明为 extern 也未事先声明为具有外部链接;或者
  • (3.3) — 匿名联合的数据成员。

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

6.5 [也是 10.1.7]

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

基本原理:因为在 C++ 中的转换过程中,const 对象可能被用作值,因此该特性促使程序员为每个 const 对象提供一个显式的初始化程序。此功能允许用户将 const 对象放入包含在多个翻译单元中的源文件中。

对原始特征的影响:更改为明确定义的特征的语义。

转换难度:语义转换。

使用范围:很少。

另请参阅:为什么 const 在 C++ 中暗示内部链接,而在 C 中却没有?

您可能想要在标题上做的事情

详细解释在:C 和 C++ 中的“const static”是什么意思?

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