2

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

#include<stdio.h>

static int A;

void main()
{
    ...
}
4

5 回答 5

7

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

一方面 A 是静态全局变量,所以它是全局定义的

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

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

于 2012-08-12T22:22:31.870 回答
3

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

于 2012-08-12T22:25:14.867 回答
2

我认为没有一个特定的、广泛使用的术语来表示那些“静态全局变量”。问题是该标准通常从不谈论“全局变量”,但它区分了两个正交概念:

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

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

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

于 2012-08-12T22:26:11.040 回答
1

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

于 2012-08-12T22:29:53.283 回答
1

正如其他人所说,这取决于您为什么关心它是“全球性的”。在大型源文件中,静态变量会在函数之间引入难以追踪的耦合,就像非静态函数一样。当然,不同之处在于静态变量仅限于单个源文件,但如果您在该源文件中有数百个函数,您必须费力地找出意外修改的来源从。

于 2012-08-12T23:11:20.060 回答