【问题标题】:Understanding static storage class in C了解 C 中的静态存储类
【发布时间】:2013-06-19 03:57:57
【问题描述】:

static 是全局变量的默认存储类。下面的两个变量(CountRoad)都有static 存储类。

static int Count;
int Road;
int main()
{
    printf("%d\n", Road);
    return 0;
}

我的问题是:如果默认全局变量是static(这意味着我们将该全局变量的范围限制在特定的.c文件中)那么我们如何extern另一个文件中的那些变量?

这个问题对你们中的许多人来说可能非常基础,但我真的很困惑,想了解正确的细节。

【问题讨论】:

  • 你的第一句话是假的。在文件范围内声明为 static 的变量不是全局变量。
  • 您的来源有误。默认情况下,在文件范围内声明的变量和函数具有extern 存储类(尽管这给了它们静态duration)。 static 关键字为它们提供了静态存储类。
  • @hobbs:在文件范围内声明为外部链接和静态存储持续时间的对象。

标签: c


【解决方案1】:

在正式的 C 术语中,externstaticregister 等说明符称为 storage-class 说明符,但这些说明符控制的实际对象属性称为 存储期限链接

在您的问题中,您似乎混合了这两个不相关的概念:storage durationlinkage。它实际上是 linkage 描述了对象的外部可见性。

在文件范围内定义的所有变量都具有静态存储持续时间(无论您是否在声明中使用了关键字static)。这仅仅意味着他们永远活着,但并没有说明他们的外部可见性。同时,使用关键字static定义的变量具有内部链接,而没有任何关键字或使用关键字extern定义的变量具有外部链接。

在您的示例变量Road 具有静态存储持续时间和外部 链接,这就是您可以直接从其他翻译单元访问它的原因。变量Count 具有静态存储持续时间和内部链接,这就是为什么您不能直接从其他翻译单元访问它的原因。

如果您声明一个没有存储类说明符的变量(例如您的示例中的Road),它将被视为所谓的暂定定义,并最终解析(在您的示例中)为一个变量具有静态存储持续时间和外部链接。因此,从这个角度来看,文件范围变量的默认(隐含)存储类说明符实际上是 extern,而不是 static

【讨论】:

  • 如果C“没有'存储类'这样的术语”这个答案是不正确的。
  • @hobbs:很抱歉让我感到困惑。您在原始问题下的评论是正确的,从某种意义上说,在没有存储类说明符的情况下声明的变量的行为就像使用 extern 存储类说明符声明的一样(当然,当我们考虑暂定定义时,事情会变得更加复杂,但那是另一回事)。
【解决方案2】:

变量Count 只能在这个源文件中通过名称访问,因为它前面有static。正式地说,它具有内部链接(参见 ISO/IEC 9899:2011 §6.2.2 标识符链接)。

变量Road 可以从其他源文件访问,如果这些文件包含extern int Road; 的等效项作为语句之一。正式地说,它具有外部链接

一般来说,大多数人会将Count 称为静态变量,将Road 称为全局变量。

另见What are extern variables in C?

【讨论】:

  • 那么全局变量的默认存储类是什么?
  • '全局变量'变量不是Standard C中定义的术语。但是,具有外部链接的变量是大多数人认为的全局变量,因此它们的存储类是extern
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2016-11-11
  • 2014-01-08
  • 2019-09-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多