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

时间:2015-02-19 15:52:50

标签: c++ c static global extern

我经历了以下两个问题:

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关键字),则默认情况下全局变量具有外部链接

我需要知道以下内容:

  1. 默认情况下,链接(或)中的全局变量extern是否等同于通过指定extern存储类来声明变量?
  2. 默认情况下,范围(或)中的全局变量static是否等同于通过指定static存储类来声明变量?
  3. CC++有任何区别吗?有人可以澄清一下吗?

2 个答案:

答案 0 :(得分:8)

  

默认情况下,全局变量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
extern int x;   
  

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

没有。如上所述,其持续时间为static,并且具有文件范围。

  

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

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

答案 1 :(得分:3)

  

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

除非另有说明,否则它们具有外部链接(C ++除外,如果它们保持不变,则它们具有内部链接。)

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

  

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

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

  

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

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