了解C中的静态存储类
static
是全局变量的默认存储类。 下面的两个变量( Count
和Road
)都有static
存储类。
static int Count; int Road; int main() { printf("%d\n", Road); return 0; }
我的问题是:如果默认情况下全局变量是static
(这意味着我们将该全局变量的范围限制为该特定的.c
文件)那么我们如何在另一个文件中对这些变量进行extern
?
这个问题对你们很多人来说可能是非常基本的,但我真的很困惑,想要了解正确的细节。
在正式的C术语中, extern
, static
, register
等说明符称为存储类说明符,但这些说明符控制的实际对象属性称为存储持续时间和链接 。
在您的问题中,您似乎将这两个不相关的概念混合在一起: 存储持续时间和链接 。 它实际上是描述对象外部可见性的链接 。
文件范围中定义的所有变量都具有静态存储持续时间(无论您是否在声明中使用了关键字static
)。 这仅仅意味着他们永远存在,但它没有说明他们的外部可见性。 同时,使用关键字static
定义的变量具有内部链接,而没有任何关键字或关键字extern
定义的变量具有外部链接。
在您的示例变量中, Road
具有静态存储持续时间和外部链接,这就是您可以直接从其他翻译单元访问它的原因。 变量Count
具有静态存储持续时间和内部链接,这就是您无法直接从其他翻译单元访问它的原因。
如果声明一个没有存储类说明符的变量(如示例中的Road
),它将被视为所谓的暂定定义,并最终解析(在您的示例中)为具有静态存储持续时间和外部链接的变量。 因此,从这个角度来看,对于文件范围变量的默认(隐含)存储类说明符实际上是extern
而不是static
。
变量Count
只能在这个源文件中按名称访问,因为它前面有static
。 在forms上,据说它具有内部联系 (参见ISO / IEC 9899:2011§6.2.2标识符的链接)。
如果那些文件包含相当于extern int Road;
话,可以从其他源文件访问变量extern int Road;
作为其中一个陈述。 在forms上,据说有外部联系 。
通常,大多数人会将Count
称为静态变量,将Road
称为全局变量。
另请参见C中的extern
变量是什么?