具体来说,在C ++中,例如之间的语义差异是什么:
static const int x = 0 ;
和
const int x = 0 ;
同时static
用作链接和存储类说明符(即函数内部和外部)。
::
没有标识符)进行访问)。我不知道全局名称空间和嵌套在其中的任何名称空间之间的任何有意义的区别。当然没有关于static
对象的任何东西。
具体来说,在C ++中,例如之间的语义差异是什么:
static const int x = 0 ;
和
const int x = 0 ;
同时static
用作链接和存储类说明符(即函数内部和外部)。
::
没有标识符)进行访问)。我不知道全局名称空间和嵌套在其中的任何名称空间之间的任何有意义的区别。当然没有关于static
对象的任何东西。
Answers:
在文件范围内,C ++没有区别。 const
将内部链接设置为默认值,并且所有全局变量都具有静态生存期。但是第一个变体在C中具有相同的行为,因此这可能是使用它的一个很好的理由。
在一个函数中,可以根据参数计算第二个版本。在C或C ++中,它不必像某些其他语言所要求的那样是编译时常量。
在一个类中,与函数基本相同。const
可以在ctor-initializer-list中计算实例值。static const
在启动初始化期间设置A ,在其余程序中保持不变。(注意:static
成员的代码看起来有些不同,因为声明和初始化是分开的。)
请记住,在C ++中,它const
表示只读,而不是常量。如果您有指向的指针const
,则程序的其他部分可能会在您不查找时更改该值。如果使用定义了变量const
,则初始化后没有人可以更改它,但是初始化仍然可以是任意复杂的。
const
适用于变量的视图而不是变量本身,其他人可以具有const
相同变量的非视图,并且编译器在修改变量时将保持沉默。
const
,但是constexpr
可以代替使用新的(以及在其他情况下)。实际上,C ++ 0x标准还将const
在这种情况下使用的能力扩展到了非集成的“文字类型”。我认为我更喜欢constexpr
在这些情况下使用,因为无论如何您都将破坏与C ++ 0x以前的编译器的向后兼容性。
关于文件范围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更改为以下原因的理由:
6.5 [也10.1.7]
更改:显式声明为const而不显式声明为extern的文件范围的名称具有内部链接,而在C中它将具有外部链接。
原理:由于const对象可以在C ++转换过程中用作值,因此此功能敦促程序员为每个const对象提供一个显式的初始化程序。此功能允许用户将const对象放入多个翻译单元中包含的源文件中。
对原始特征的影响:更改了定义明确的特征的语义。
转换困难:语义转换。
广泛使用:很少。
另请参见:为什么const在C ++中隐含内部链接,而在C语言中却不隐含?
您可能想在标头上执行的操作
详细解释于:C和C ++中的“常量静态”是什么意思?
extern
在标头中,在cpp文件中定义
static
可能是C ++中最重载的关键字。您的代码的含义差异很大,具体取决于它是在名称空间范围,类范围还是函数范围。您可能需要澄清一下。