我们可以将全局静态变量视为全局变量吗?
Can we consider global static variable as global variable
问题是我们可以将变量A称为"全局变量"吗?一方面,A 是静态全局变量,因此根据定义它是全局变量,从另一个全局变量来看,它必须在程序的每个点中都可用,而不仅仅是在当前的翻译单元中。谢谢。
#include<stdio.h>
static int A;
void main()
{
...
}
不,static
不是全局的,因为它具有内部链接。定义它的每个 TU 都将存在一个副本。
一方面,A 是静态全局变量,因此根据定义它是全局变量
为什么它是一个静态全局变量?是的,static
,但仅此而已。
C++中的全局变量是那些声明extern
并仅定义一次的变量,或者作为static
成员包含的变量(具有完全不同的含义)。
变量A
具有静态存储,并在文件范围内定义,并且具有内部链接。术语"全局变量"只是一个口语,并不能完全准确地捕捉所有这些细微差别。变量当然是全局的,因为它可以从每个范围访问,并且它的生存期是从程序开始到程序结束,但由于其内部链接,它不能从声明它的翻译单元外部访问。
我认为没有一个特定的、广泛的术语来表示这些"静态全局变量";问题是该标准从不谈论一般的"全局变量",但它区分了两个正交概念:
- 变量
- 的生存期,对于全局变量、"静态全局变量"和
static
局部变量是相同的; 标准称它们为"具有静态存储持续时间的变量"; - 这些变量的可见性,在所有情况下都不同;"全局"是在全局命名空间范围内定义的具有外部链接的变量;"静态全局变量"在相同的范围内定义,但具有内部链接;最后,
static
局部变量具有局部作用域。
称为"全局变量"是否正确?如前所述,该标准从未定义"全局变量",因此这应该是一个品味问题:它们是在全局命名空间范围内定义的,但由于它们具有内部链接,因此在其他模块中无法访问它们。
不过,请记住,一般来说,在谈论全局变量时C++我们指的是在全局命名空间范围内定义的具有外部链接的变量。所以,总而言之,我不会称它们为全局变量,我看到的唯一明确的称呼方式是"在具有内部链接的全局命名空间范围内定义的变量"。
正如其他人所说,这取决于你为什么关心它是"全球性的"。在大型源文件中,静态变量可能会在函数之间引入难以跟踪的耦合,就像非静态函数一样。当然,区别在于静态变量仅限于单个源文件,但如果该源文件中有数百个函数,则必须通过这些函数来确定意外修改的来源,那么这是一个小小的安慰。
将其视为一个模块变量,因为它对一个模块可见(此处为"翻译单元"),而不是对所有模块可见。
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- 在.cpp文件之间传递全局字符串变量?
- 具有全局定义变量的递归比没有全局定义变量的递归函数获得更多的堆栈.为什么?(跳入C++)
- 为什么使用 SPI 时,全局缓冲区变量产生的结果与局部缓冲区变量不同
- 全局销毁期间全局布尔变量可靠吗?
- 全局自动变量可以在 h 文件中声明吗?
- 将全局外部变量的私有版本与 OpenMP 结合使用
- 使用全局 lua_State* 变量
- 为什么C 17中的全局内线变量和静态内线成员需要警卫
- 为全局constexpr变量生成唯一值
- C++:为全局类变量赋值
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 全局静态变量不"staying defined"函数外部
- 为什么不调用全局静态变量的析构函数
- 全局使用变量定义和C 声明
- 定义,初始化全局const变量是安全的吗?
- C 全局对象变量内存释放
- 全局静态变量阴影
- C++ 中的全局类变量与指针
- 可以静态访问全局静态变量的静态函数