在C++中,例如以下代码片段之间的语义区别是什么:
static const int x = 0 ;
并且
const int x = 0 ;
对于static
作为链接和存储类说明符(即在函数内部和外部),都适用。
在C++中,例如以下代码片段之间的语义区别是什么:
static const int x = 0 ;
并且
const int x = 0 ;
对于static
作为链接和存储类说明符(即在函数内部和外部),都适用。
在C++中在文件作用域上没有区别。 const
使内部链接成为默认选项,并且所有全局变量都具有静态生存期。但是,在C中,第一个变体具有相同的行为,因此可能是使用它的好理由。
在函数内部,第二个版本可以从参数计算出来。在C或C++中,它不必像其他语言要求的那样是编译时常量。
在类内部,与函数基本相同。实例const
值可以在ctor-initializer-list中计算。 static const
在启动初始化期间设置,并在程序的其余部分保持不变。(注意:对于static
成员的代码看起来有点不同,因为声明和初始化被分开了。)
请记住,在C++中,const
表示只读,而不是常量。如果您有指向const
的指针,则程序的其他部分可能会在您不注意的情况下更改该值。如果使用const
定义变量,则初始化之后无法更改,但初始化仍然可以任意复杂。
const
适用于变量的视图,而不是变量本身,其他人可以拥有相同变量的非const
视图,并且当他们修改它时,编译器会保持沉默。 - Ben VoigtC++17标准草案中的const
暗示在文件作用域下为static
这是来自https://dev59.com/RnA65IYBdhLWcg3wogSe#3709257的引用。
C++17 n4659标准草案 6.5 “程序和链接”:
3 具有命名空间作用域(6.3.6)的名称如果是以下之一,就具有内部链接:
- (3.1) — 显式声明为 static 的变量、函数或函数模板;或者
- (3.2) — 非内联的非易失性 const 限定类型的变量,既没有显式声明 extern,也没有先前声明为具有外部链接;或者
- (3.3) — 匿名联合体的数据成员。
附录 C(供参考)兼容性,C.1.2 第 6 条:“基本概念”解释了为什么要从 C 中进行更改:
6.5 [还有 10.1.7]
更改:在 C++ 中,如果一个具有文件作用域的名称被显式声明为 const,且没有显式声明为 extern,则具有内部链接;在 C 中具有外部链接。
原因:由于在 C++ 中 const 对象可能在编译期间用作值,这个特性促使程序员为每个 const 对象提供显式初始化程序。该特性允许用户将 const 对象放置在包含在多个翻译单元中的源文件中。
对原有特性的影响:更改了规定良好的特性的语义。
转换的难度:语义转换。
使用范围:很少。
另请参阅:为什么在C ++中,const暗示内部链接,而在C中不是这样?
在头文件中可能想要做的替代方法
详细说明见:C和C ++中“const static”是什么意思?
extern
,在 cpp 文件中定义