问题是我们可以将变量称为“全局变量”吗?一方面,A 是静态全局变量,因此根据定义它是全局变量,另一方面,全局变量必须在程序的每个点都可用,而不仅仅是在当前翻译单元中。谢谢。
#include<stdio.h>
static int A;
void main()
{
...
}
问题是我们可以将变量称为“全局变量”吗?一方面,A 是静态全局变量,因此根据定义它是全局变量,另一方面,全局变量必须在程序的每个点都可用,而不仅仅是在当前翻译单元中。谢谢。
#include<stdio.h>
static int A;
void main()
{
...
}
不,astatic
不是全局的,因为它具有内部链接。定义它的每个 TU 都将存在一个副本。
一方面 A 是静态全局变量,所以它是全局定义的
为什么它是静态全局变量?是的static
,是的,但仅此而已。
C++ 中的全局变量是extern
只声明和定义一次的变量,或者作为static
成员包含的变量(具有完全不同的含义)。
您的变量A
具有静态存储并在文件范围内定义,并且具有内部链接。术语“全局变量”只是一种口语,不能完全准确地捕捉所有这些细微差别。这个变量肯定是全局的,因为它可以从每个范围访问,它的生命周期是从程序开始到程序结束,但是由于它的内部链接,它不能从声明它的翻译单元之外访问。
我认为没有一个特定的、广泛使用的术语来表示那些“静态全局变量”。问题是该标准通常从不谈论“全局变量”,但它区分了两个正交概念:
static
局部变量都是一样的;该标准将它们全部称为“具有静态存储持续时间的变量”;static
局部变量具有局部作用域。将“静态全局变量”称为“全局变量”是否正确?如前所述,该标准从未定义“全局变量”,因此这应该是一个品味问题:它们是在全局命名空间范围内定义的,但由于它们具有内部链接,因此在其他模块中无法访问它们。
不过,请记住,通常,当谈论 C++ 中的全局变量时,我们指的是在全局命名空间范围内定义的具有外部链接的变量。所以,总而言之,我不会称它们为全局变量,我看到的唯一明确的调用方式是“在具有内部链接的全局命名空间范围内定义的变量”。
将其视为一个模块变量,因为它对一个模块(此处意为“翻译单元”)可见,而不是对所有模块可见。
正如其他人所说,这取决于您为什么关心它是“全球性的”。在大型源文件中,静态变量会在函数之间引入难以追踪的耦合,就像非静态函数一样。当然,不同之处在于静态变量仅限于单个源文件,但如果您在该源文件中有数百个函数,您必须费力地找出意外修改的来源从。