Nav*_*een 16 c c++ static global-variables
声明为staticC和C++之间的任何函数之外的变量之间是否存在任何差异.我读到这static意味着文件范围和变量将无法在文件外部访问.我还读到在C中,全局变量是static.那么这是否意味着C中的全局变量无法在另一个文件中访问?
Eli*_*sky 16
不,在这方面C和C++没有区别.
阅读这个关于staticC程序中的含义的答案.在C++中,还有一些与使用static类变量(而不是实例变量)相关的其他含义.
关于全局变量static- 仅从内存分配的角度来看(它们被分配在数据段上,就像所有全局变量一样).从可见性的角度来看:
static int var; // can't be seen from outside files
int var; // can be seen from outside files (no 'static')
Run Code Online (Sandbox Code Playgroud)
C和C++是一样的.
static做了两件不同的事情.
对于在函数作用域外声明的变量,它会更改变量的可见性(链接).变量将是一个全局变量,因为它在函数范围之外.如果它不是静态的,它将具有通用链接(可见性),因此与此链接在一起的任何代码都可以访问它(它们可能必须将其声明为extern).如果变量在函数作用域之外并且是静态的,它仍然是一个全局变量,因为它始终存在并保持其值,但是在同一编译单元(.c文件和包含的任何.h)之外的代码都不能访问它.
对于在函数作用域内声明的变量,static会更改存储变量的位置.如果它不是静态的,它将是一个自动变量,这意味着它会在函数退出时消失,并在再次输入函数时重新出现(在堆栈中).退出函数时它会丢失它的值.并且在函数退出后,对它的任何引用(指向它)都是无效的.如果在函数作用域内声明的变量是静态的,那么它使它不是自动变量而是全局分配的变量.因此,变量将在函数退出后存在,因此将在函数的调用中保持其值,并且即使在函数退出之后,对它的任何引用(指针)也是有效的.请注意,在这两种情况下,变量的范围仅在该函数内,因此无法从函数范围外直接访问它(但仅通过保存的引用).
静态做的最后一件事是在运行变量的初始值设定项(即int foo = 5)时进行更改.对于分配是全局的所有情况(除了自动分配之外的每种情况),初始化程序仅在程序执行开始时运行一次.它在main()运行之前运行,因此如果初始化程序不仅仅是一个常数而是运行一些代码,那么你可以获得一些不太理想的结果.对于自动情况,每次输入函数时都会运行初始化程序,在这种情况下,它始终在输入main()之后运行.