我经历了以下两个问题:
static and extern global variables in C and C++
global variable in C are static or not?
这两个问题以不同的方式说明这两件事。
问题1的答案:
默认情况下,C和C ++上的全局变量不是extern或static。
问题2的答案:
如果未指定存储类(即extern或static关键字),则默认情况下全局变量具有外部链接
我需要知道以下内容:
extern
是否等同于通过指定extern
存储类来声明变量?static
是否等同于通过指定static
存储类来声明变量?C
或C++
有任何区别吗?有人可以澄清一下吗?答案 0 :(得分:8)
默认情况下,全局变量
extern
在链接中(或)它等同于通过指定extern
存储类来声明变量?
在最外层的任何块外声明的变量的默认存储持续时间,范围和链接具有static
存储持续时间,文件范围和external
链接。 C11标准说:
[...]如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,标识符具有文件范围 ,则终止在翻译单元的末尾。 [...]
[...]如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接为
external
。
在没有存储类说明符的情况下声明其标识符的对象
_Thread_local
以及外部或内部链接或存储类说明符static
具有静态存储持续时间。
所以,如果x
是全球性的
int x;
然后它的存储持续时间,范围和链接相当于
中的x
extern int x;
默认情况下全局变量
static
在范围(或)中它等同于通过指定static
存储类来声明变量?
没有。如上所述,其持续时间为static
,并且具有文件范围。
如果有任何c或c ++差异请澄清?
没有区别。两种语言的规则相同。
答案 1 :(得分:3)
默认情况下,全局变量是extern在链接(或)中它等同于通过指定extern存储类来声明变量吗?
除非另有说明,否则它们具有外部链接(C ++除外,如果它们保持不变,则它们具有内部链接。)
你链接到的第一个答案是说它不等于宣告它extern
(这使得它成为纯粹的声明,而不是定义);并不是说它没有外部联系。
默认情况下全局变量在范围(或)中是静态的,它等同于通过指定静态存储类来声明变量吗?
在C ++中,如果它们是常量,则它们具有内部链接(如同声明static
),否则它们具有外部链接。在C中,它们总是有外部联系。
如果有任何c或c ++差异请澄清?
如上所述,默认值始终是C中的外部链接,而在C ++中,它是内部的常量变量。