【问题标题】:Storage Class of Default Global variable (gcc compiler)?默认全局变量的存储类(gcc编译器)?
【发布时间】:2016-11-01 08:21:48
【问题描述】:

在C中,(GCC编译器),全局变量的默认存储类是什么?

让我分享一个代码示例:

int i; 

void f()
{ --statements--}

main()
{ --- set of statements--- }

如果我说变量 i 是静态的而不是外部的,我说得对吗?

【问题讨论】:

  • 为什么这是 GCC 特有的?语言不是说它是什么吗?
  • 据我所知。不同的编译器之间存在一些差异。在形式参数中,例如 --> int func(int x) ,x 可以是 register(在 gcc 中)或 auto(在 turbo c 中),具体取决于编译器版本。
  • 什么是 Turbo C 中的 auto ??
  • @Doherty 函数参数与存储持续时间和文件范围变量的链接完全无关......话虽如此,所有标准编译器在任何一种情况下的行为都是相同的。
  • @Lundin。对不起。我没明白。你能帮我改一下吗?

标签: c variables gcc storage-class-specifier


【解决方案1】:

在此代码中,i 具有静态存储持续时间,以及外部链接

存储持续时间是指变量存储的生命周期。 静态存储时长表示变量在程序的整个生命周期内都存在。

联动是指名称和对象之间的关系。 外部链接意味着具有外部链接的名称的所有实例都表示同一个对象。您的 int i; 将匹配来自另一个翻译单元的声明 extern int i;

关键字static在不同的上下文中用作存储持续时间说明符和链接说明符,因此不清楚变量是否为static。相反,应该考虑变量的存储持续时间和链接。

【讨论】:

  • 您能否分享一个默认显示外部链接的示例?运行时遇到链接错误。
  • 通过外部链接,您的意思是该变量可以被另一个不同的文件/程序访问吗?或者它可以被同一个程序中的函数访问?
  • @Doherty 同一程序中的其他文件。如果您遇到链接错误,请使用您的 exact 代码(以及您用于编译和链接的命令)发布一个新问题。但是先检查this thread,看看那里是否提到了问题。
【解决方案2】:

对于在任何函数之外声明的变量,您有以下情况:

static int variableWithfileScope;  // Not exported. Only visible in current file.

int globalVariableThatIsExported;  // Exported. 

// Forward declaration. No variable defined.
extern int globalVariableThatIsDefinedSomewhereElse;  

这是标准定义的,适用于所有C编译器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多