全局变量的默认存储类别是什么?

问题描述 投票:0回答:3

全局变量的默认存储类别是什么?

在网上搜索时我发现,有些网站说是

static
。但是,静态意味着内部链接,并且变量在文件范围之外不可用,即它不应对其他目标文件可用。但是,它们仍然可以使用诸如
extern int i
之类的声明来访问其他文件。

并且,如果我明确提及全局变量

static
,那么它在文件范围之外不可用。

那么,全局变量的正确默认存储类别是什么?

c++ global-variables storage default extern
3个回答
18
投票

默认存储时长是静态的,但默认联动是外部的。您并不是唯一一个觉得这有点令人困惑的人。 C 书(始终是一个很好的参考)说:

“你可能会发现互动 在这些不同的元素之间 既复杂又令人困惑:那就是 因为他们就是!”

引用这句话的部分,声明、定义和可访问性,有一个有用的表格(8.1)。最后一行描述了您感兴趣的情况。正如它所指出的,没有存储类说明符的数据对象具有外部链接和静态持续时间。


18
投票

对于通常所说的“全局”变量,没有“默认存储类”。当变量在命名空间范围内定义时,它始终具有静态存储持续时间。没有办法改变这一点,这就是为什么“默认”的想法在这里不适用。 (正确的说法是“存储持续时间”。) 当您将关键字

static

应用于命名空间范围中定义的变量时,它不会影响其

存储持续时间
- 它已经是静态的并且仍然是静态的 - 但它会影响它链接。关键字 static 将此类变量的链接从外部(默认)更改为内部。
链接
是一个单独的概念,实际上与存储持续时间无关。


0
投票
static

。然而,在这种情况下澄清

static
的含义很重要,因为它可能会引起混乱。
当在没有任何存储类说明符的情况下声明全局变量时,它会隐式给出存储类说明符

static

。这意味着该变量具有静态存储持续时间,这意味着以下内容:


  1. 静态存储持续时间

    :变量在程序的整个持续时间内都存在。它在程序启动时分配并保留在内存中直到程序终止。

  2. 内部链接

    :变量只能在定义它的文件中访问。这就是为什么它有时被称为“文件范围”。无法直接从其他源文件访问它。

  3. 但是,您已经正确地注意到,您仍然可以使用
static

关键字从其他源文件访问

extern
全局变量。这是因为
extern
用于声明在其他地方定义的变量的存在。因此,您可以在另一个源文件中提供类似
extern int i;
的声明,以指示在其他地方通过外部链接定义了全局变量
i
总结一下:

全局变量的默认存储类别:
    static
  • (默认静态存储持续时间和内部链接)
    您仍然可以通过在其他源文件中将全局变量声明为 
  • static
  • 来访问这些文件中的
    extern
    全局变量。这为它们提供了外部链接,并使它们可以跨翻译单元(源文件)访问。
    
        
© www.soinside.com 2019 - 2024. All rights reserved.