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

问题描述 投票:10回答:2

我经历了以下两个问题:

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++有什么区别吗?有人可以澄清一下吗?
c++ c static global extern
2个回答
9
投票

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

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

6.2.1 Scopes of identifiers (p4):

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

6.2.2 Linkages of identifiers (p5):

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

6.2.4 Storage durations of objects (p3):

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

所以,如果x是全球性的

int x;

那么它的存储时间,范围和联系相当于x in

extern int x;   

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

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

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

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


4
投票

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

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.