我们可以将全局静态变量视为全局变量吗?

Can we consider global static variable as global variable

本文关键字:全局变量 变量 静态 全局 我们      更新时间:2023-10-16

问题是我们可以将变量A称为"全局变量"吗?一方面,A 是静态全局变量,因此根据定义它是全局变量,从另一个全局变量来看,它必须在程序的每个点中都可用,而不仅仅是在当前的翻译单元中。谢谢。

#include<stdio.h>
static int A;
void main()
{
    ...
}

不,static不是全局的,因为它具有内部链接。定义它的每个 TU 都将存在一个副本。

一方面,A 是静态全局变量,因此根据定义它是全局变量

为什么它是一个静态全局变量?是的,static,但仅此而已。

C++中的全局变量是那些声明extern并仅定义一次的变量,或者作为static成员包含的变量(具有完全不同的含义)。

变量A具有静态存储,并在文件范围内定义,并且具有内部链接。术语"全局变量"只是一个口语,并不能完全准确地捕捉所有这些细微差别。变量当然是全局的,因为它可以从每个范围访问,并且它的生存期是从程序开始到程序结束,但由于其内部链接,它不能从声明它的翻译单元外部访问。

我认为没有一个特定的、广泛的术语来表示这些"静态全局变量";问题是该标准从不谈论一般的"全局变量",但它区分了两个正交概念:

    变量
  • 的生存期,对于全局变量、"静态全局变量"和static局部变量是相同的; 标准称它们为"具有静态存储持续时间的变量";
  • 这些变量的可见性,在所有情况下都不同;"全局"是在全局命名空间范围内定义的具有外部链接的变量;"静态全局变量"在相同的范围内定义,但具有内部链接;最后,static局部变量具有局部作用域。
将"静态全局变量"

称为"全局变量"是否正确?如前所述,该标准从未定义"全局变量",因此这应该是一个品味问题:它们是在全局命名空间范围内定义的,但由于它们具有内部链接,因此在其他模块中无法访问它们。

不过,请记住,一般来说,在谈论全局变量时C++我们指的是在全局命名空间范围内定义的具有外部链接的变量。所以,总而言之,我不会称它们为全局变量,我看到的唯一明确的称呼方式是"在具有内部链接的全局命名空间范围内定义的变量"。

正如其他人所说,这取决于你为什么关心它是"全球性的"。在大型源文件中,静态变量可能会在函数之间引入难以跟踪的耦合,就像非静态函数一样。当然,区别在于静态变量仅限于单个源文件,但如果该源文件中有数百个函数,则必须通过这些函数来确定意外修改的来源,那么这是一个小小的安慰。

将其视为一个模块变量,因为它对一个模块可见(此处为"翻译单元"),而不是对所有模块可见。