全局变量的默认存储类别是什么?
在网上搜索时我发现,有些网站说是
static
。但是,静态意味着内部链接,并且变量在文件范围之外不可用,即它不应对其他目标文件可用。但是,它们仍然可以使用诸如 extern int i
之类的声明来访问其他文件。
并且,如果我明确提及全局变量
static
,那么它在文件范围之外不可用。
那么,全局变量的正确默认存储类别是什么?
默认存储时长是静态的,但默认联动是外部的。您并不是唯一一个觉得这有点令人困惑的人。 C 书(始终是一个很好的参考)说:
“你可能会发现互动 在这些不同的元素之间 既复杂又令人困惑:那就是 因为他们就是!”
引用这句话的部分,声明、定义和可访问性,有一个有用的表格(8.1)。最后一行描述了您感兴趣的情况。正如它所指出的,没有存储类说明符的数据对象具有外部链接和静态持续时间。
对于通常所说的“全局”变量,没有“默认存储类”。当变量在命名空间范围内定义时,它始终具有静态存储持续时间。没有办法改变这一点,这就是为什么“默认”的想法在这里不适用。 (正确的说法是“存储持续时间”。) 当您将关键字
static
应用于命名空间范围中定义的变量时,它不会影响其
存储持续时间- 它已经是静态的并且仍然是静态的 - 但它会影响它链接。关键字
static
将此类变量的链接从外部(默认)更改为内部。 链接是一个单独的概念,实际上与存储持续时间无关。
static
。然而,在这种情况下澄清
static
的含义很重要,因为它可能会引起混乱。当在没有任何存储类说明符的情况下声明全局变量时,它会隐式给出存储类说明符static
。这意味着该变量具有静态存储持续时间,这意味着以下内容:
:变量在程序的整个持续时间内都存在。它在程序启动时分配并保留在内存中直到程序终止。
:变量只能在定义它的文件中访问。这就是为什么它有时被称为“文件范围”。无法直接从其他源文件访问它。
static
关键字从其他源文件访问
extern
全局变量。这是因为 extern
用于声明在其他地方定义的变量的存在。因此,您可以在另一个源文件中提供类似 extern int i;
的声明,以指示在其他地方通过外部链接定义了全局变量 i
。总结一下:
全局变量的默认存储类别:
static
static
extern
全局变量。这为它们提供了外部链接,并使它们可以跨翻译单元(源文件)访问。