7

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

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

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

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

4

2 回答 2

14

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

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

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

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

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

于 2013-06-19T04:28:05.710 回答
7

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

如果这些文件包含相当于语句之一,则Road可以从其他源文件访问该变量。extern int Road;形式上,据说有外联

通常,大多数人会调用Count静态变量和Road全局变量。

另请参阅什么是externC 中的变量?

于 2013-06-19T04:03:48.077 回答