C++;`static const`vs`const`的语义` C++中具体地说,例如:之间的语义差异是什么? static const int x = 0 ;

C++;`static const`vs`const`的语义` C++中具体地说,例如:之间的语义差异是什么? static const int x = 0 ;,c++,C++,及 > 静态作为链接和存储类说明符(即函数内部和外部).< /p> 在文件范围内,C++没有差异。code>const将内部链接设置为默认值,并且所有全局变量都具有静态生存期。但是第一个变体在C中具有相同的行为,因此这可能是使用它的一个很好的理由 在函数中,可以根据参数计算第二个版本。在C或C++中,它不一定是编译时常数,就像其他语言所要求的一样。 在类中,基本上与函数相同。可以在ctor初始值设定项列表中计算实例const值。在启动初始化期间设置一个静态常量,并在程序的其余部分保持不变。(注


<> > <代码>静态<代码>作为链接和存储类说明符(即函数内部和外部).< /p> 在文件范围内,C++没有差异。code>const将内部链接设置为默认值,并且所有全局变量都具有静态生存期。但是第一个变体在C中具有相同的行为,因此这可能是使用它的一个很好的理由

在函数中,可以根据参数计算第二个版本。在C或C++中,它不一定是编译时常数,就像其他语言所要求的一样。 在类中,基本上与函数相同。可以在ctor初始值设定项列表中计算实例
const
值。在启动初始化期间设置一个
静态常量
,并在程序的其余部分保持不变。(注意:
static
成员的代码看起来有些不同,因为声明和初始化是分开的。)


<>请记住,在C++中,<>代码> const 意味着<强>只读< /强>,而不是<强>常量< /强>。如果您有一个指向-
const
的指针,那么程序的其他部分可能会在您不查看时更改该值。如果变量定义为
const
,则初始化后没有人可以更改它,但初始化仍然可以是任意复杂的。

C++17关于
const
的标准草案意味着文件范围内的
静态

这是对以下内容的引用:

6.5“程序和链接”:

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

  • (3.1)-明确声明为静态的变量、函数或函数模板;或者
  • (3.2)-非易失性常量限定类型的非内联变量,既不显式声明为extern,也不显式声明为extern 先前宣布有外部联系;或
  • (3.3)-匿名联盟的数据成员
附录C(资料性)兼容性,C.1.2 第6条:“基本概念”给出了将C改为C的理由:

6.5[也是10.1.7]

更改:显式声明为const而非显式声明为extern的文件作用域的名称已更改 内部链接,而在C中它将具有外部链接

理论:因为在C++中翻译时,const对象可以用作值,这个特性促使 程序员为每个const对象提供显式初始值设定项。此功能允许用户将 源文件中包含在多个翻译单元中的常量对象

对原始特征的影响:更改定义良好的特征的语义

转换的困难:语义转换

使用范围:很少

另见:

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

详情请参阅:

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

<代码>静态可能是C++中最重载的关键字。根据代码是在命名空间范围内、类范围内还是函数范围内,代码的含义差别很大。你可能想澄清一下。@sbi:我想我已经澄清了。函数范围(其中它是存储类说明符)和文件范围(其中它是链接说明符)。关于这个问题,我并不特别关心类成员和命名空间范围的变量,尽管如果有人觉得有一个有趣的区别,也可以随意讨论一下。@Clifford:很抱歉,我忽略了最后几句话。然而,这揭示了你的误解:在C++中,文件范围是命名空间范围。如果您在任何名称空间之外声明任何内容,它将只属于全局名称空间(并且可以通过前缀
访问,前面没有标识符)。我不知道全局名称空间和嵌套在其中的任何名称空间之间有任何有意义的区别。当然没有任何关于
静态对象的内容。链接与可见性不同,如果交替使用它们,你会混淆与你交谈的人,也可能混淆你自己。@Ben,@sbi:我不是想说文件范围和静态链接是一样的,只是静态链接意味着文件范围。从这个意义上讲,范围(或可见性)是静态和外部链接的属性,而不是两者的同义词。我认为,原来的问题仍然很清楚,形式也很好,我们只是在讨论针对履行机构有些屈尊的评论所作的评论。我们在这里讨论的是英语的不精确语义,而不是我的理解,所以我想我们可以停下来。有什么叫做文件范围的东西吗?我刚刚检查了$3.3,我认为最接近的是“名称空间范围”。我的理解正确吗?C++03标准仅在附录中提到了文件作用域,我认为文件作用域是链接器的人工制品,而不是编译器的人工制品,因此在语言标准中可能不会引起太多注意。严格地说,它可能是“编译单元范围”。+1表示短语“const表示只读,而不是常量”,即“编译器,如果你看到有人试图修改这个const对象,请大声吠叫。”这就是为什么某些对象可以同时是const和volatile。如果你看到我尝试修改这个const对象,它更像是“编译器”(或给予其他人这样做的许可)在大多数情况下,
const
应用于变量的视图,而不是变量本身,其他人可以拥有同一变量的非
const
视图,编译器在修改它时会非常安静。@Ben:我要说清楚,C++0x没有删除
const
的特定用法,但是新的
constexpr
可以为我们提供
const int x = 0 ;