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

VIN*_*TIC 11 c c++ static global extern

我经历了两个问题,

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

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

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

问题1的答案: extern

问题2的答案: extern

我需要知道以下内容.

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

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

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

hac*_*cks 9

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

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

6.2.1标识符的范围(p4):

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

6.2.2标识符的链接(p5):

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

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

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

所以,如果x是全球性的

int x;
Run Code Online (Sandbox Code Playgroud)

那么它的存储时间,范围和联系等同x

extern int x;   
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 从这种方式来看,你的第三部分(6.2.4)读起来好像语句“int x;”相当于“extern int x;”。这将导致链接错误,因为“int x;”生成具有正确空格的符号,而“extern int x;”仅生成对其他地方定义的符号的引用。 (2认同)
  • 您缺少第三个重要的区别:声明与定义。“ extern int i;”不是定义,因此“ i”必须在其他地方定义。“ int i;”或“ extern int i = 42;”是定义,而“ i”可能未在其他地方定义。 (2认同)

Mik*_*our 7

全局变量在链接中默认是外部的(或者)它相当于通过指定外部存储类来声明变量?

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

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

全局变量在范围内默认是静态的(或者)它相当于通过指定静态存储类来声明变量?

在 C++ 中,如果它们是常量,则它们具有内部链接(就像声明一样static),否则具有外部链接。在 C 语言中,它们总是具有外部链接。

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

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