【问题标题】:Are global variables extern by default or is it equivalent to declaring variable with extern in global?全局变量是默认 extern 还是等同于在全局中用 extern 声明变量?
【发布时间】:2015-02-19 15:52:49
【问题描述】:

我已经解决了以下两个问题:

static and extern global variables in C and C++

global variable in C are static or not?

这两个问题以不同的方式表达了这两件事。

问题 1 的答案:

默认情况下,全局变量在 C 和 C++ 中既不是外部变量也不是静态变量。

问题 2 的答案:

如果不指定存储类(即 extern 或 static 关键字),则默认全局变量具有外部链接

我需要知道以下几点:

  1. 全局变量extern是否默认在链接中(或)是否等同于通过指定extern存储类来声明变量?
  2. 全局变量static是否默认在作用域内(或)是否等同于通过指定static存储类来声明变量?
  3. CC++ 有什么区别吗?谁能澄清一下?

【问题讨论】:

  • 答案:1) 是,2) 否,3) 否

标签: c++ c static global extern


【解决方案1】:

链接中的全局变量是否默认为extern(或)相当于通过指定extern存储类来声明变量?

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

6.2.1 标识符的范围(p4):

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

6.2.2 标识符的链接(p5):

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

6.2.4 对象的存储时长(p3):

一个对象,其标识符被声明为没有存储类说明符 _Thread_local,或者带有 externalinternal 链接或带有存储类说明符 static,具有 静态存储持续时间。 p>

所以,如果x 是全局的

int x;

那么它的存储时长、范围和链接等价于x in

extern int x;   

全局变量在作用域内是否默认为static(或)相当于通过指定static存储类来声明变量?

没有。正如我上面所说,它的持续时间是 static 并且它具有 file 范围。

如果有任何 c 或 c++ 的区别,请澄清?

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

【讨论】:

  • 从这种方式来看,您的第三部分 (6.2.4) 看起来好像声明 int x; 等同于 extern int x;。这将导致链接错误,因为int x; 生成具有正确空格的符号,而extern int x; 仅生成对其他地方定义的符号的引用。
  • 您缺少第三个重要区别:声明与定义。 extern int i; 不是定义,所以i 必须在别处定义。 int i;extern int i = 42; 是定义,i 可能没有在别处定义。
  • @Mark;上一个答案有一些错误。更正了。查看修订历史记录。
【解决方案2】:

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

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

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

全局变量在作用域内是否默认是静态的(或)相当于通过指定静态存储类来声明变量?

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

如果有任何 c 或 c++ 的区别,请澄清?

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

【讨论】:

    【解决方案3】:

    使用gcc version9.3.0验证:

    全局变量默认为外部变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多