了解C中的静态存储类

时间:2013-06-19 03:57:57

标签: c

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

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

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

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

2 个答案:

答案 0 :(得分:10)

在正式的C术语说明符中,如externstaticregister等称为存储类说明符,但这些说明符的实际对象属性控制称为存储持续时间链接

在您的问题中,您似乎混合了这两个不相关的概念:存储持续时间链接。它实际上是 linkage ,它描述了对象的外部可见性。

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

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

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

答案 1 :(得分:6)

变量Count只能通过此一个源文件中的名称访问,因为它前面有static。形式上,它被认为具有内部链接(参见ISO / IEC 9899:2011§6.2.2标识符的链接)。

如果这些文件包含等同于Road作为其中一个语句,则可以从其他源文件访问变量extern int Road;。形式上,据说它有外部链接

通常,大多数人会将Count称为静态变量,Road称为全局变量。

另见What are extern variables in C?