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

时间:2012-08-12 22:20:27

标签: c++ global-variables static-variables

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

#include<stdio.h>

static int A;

void main()
{
    ...
}

5 个答案:

答案 0 :(得分:7)

不,static不是全球性的,因为它具有内部线索。每个定义它的TU都会有一个副本。

  

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

为什么它是静态全局变量?它是static,是的,但就是这样。

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

我不认为有一个特定的,广泛的术语来表示那些“静态全局”;问题在于标准从不谈论“全局变量”,但它区分了两个正交概念:

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

调用“静态全局变量”“全局变量”是否正确?如前所述,标准从未定义“全局变量”,因此它应该是一个品味问题:它们在全局命名空间范围内定义,但它们在其他模块中是不可访问的,因为事实是他们有内部联系。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

正如其他人所说,这取决于你为什么关心它是“全球性的”。在大型源文件中,静态变量可以在函数之间引入难以跟踪的耦合,就像非静态函数一样。当然,不同之处在于静态变量仅限于单个源文件,但如果您在源文件中有数百个函数需要仔细研究以找出意外修改即将到来的地方,那么这样做会很小。从