默认情况下全局变量是extern还是等于在全局中使用extern声明变量?

我经历了两个问题,

C和C ++中的静态和外部全局变量

C中的全局变量是静态的还是不是?

这两个问题以不同的方式说明了这两件事。

问题1的答案: Global variables are not extern nor static by default on C and C++.

问题2的答案: If you do not specify a storage class (that is, the extern or static keywords), then by default global variables have external linkage

我需要知道以下内容。

  1. 默认情况下,全局变量是extern在链接(或)中它是否相当于通过指定extern存储类来声明变量?

2.默认情况下,全局变量在范围(或)中是静态的,它等同于通过指定静态存储类来声明变量?

3.如果有任何c或c ++差异请澄清?

默认情况下,全局变量是extern在链接(或)中它是否相当于通过指定extern存储类来声明变量?

在最外层,任何块外部声明的变量的缺省存储持续时间,范围和链接具有static存储持续时间, 文件范围和external链接。 C11标准说:

6.2.1标识符的范围(p4):

[…]如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外, 则标识符具有文件范围 ,该范围终止于转换单元的末尾。 […]

6.2.2标识符的链接(p5):

[…]如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是external

6.2.4物体的贮存期限(p3):

声明标识符的对象没有存储类说明符_Thread_local ,并且具有外部内部链接或存储类说明符static ,具有静态存储持续时间

所以,如果x是全局的

 int x; 

那么它的存储持续时间,范围和联系等于x in

 extern int x; 

默认情况下全局变量是static的(或)它是否等同于通过指定static存储类来声明变量?

不,如上所述,它的持续时间是static ,并且有文件范围。

如果有任何c或c ++差异请澄清?

没有不同。 两种语言的规则相同。

默认情况下,全局变量是extern在链接(或)中它是否相当于通过指定extern存储类来声明变量?

除非另有说明,否则它们具有外部链接(除了在C ++中,如果它们是常量,它们具有内部链接)。

你链接到的第一个答案是说它不等于将它声明为extern (这使它成为纯粹的声明,而不是定义); 并不是说它没有外部联系。

默认情况下全局变量是静态的(或)它是否等同于通过指定静态存储类来声明变量?

在C ++中,如果它们是常量,它们具有内部链接(如同声明为static ),否则它们具有外部链接。 在C中,它们总是具有外部联系。

如果有任何c或c ++差异请澄清?

如上所述,默认值始终是C中的外部链接,而在C ++中,它是常量变量的内部链接。