C和C++中的静态变量

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)

  • @Naveen:它有静态存储空间.请记住,静态存储和静态关键字不是相互的.任何非动态(从堆创建)或自动(必须在本地范围内创建)的变量都是静态的.虽然static关键字提供了一些静态存储,但它做得更多.(使其在翻译单元外部不可见.)相反,通过省略指定符,您仍然可以在单元外部看到静态存储的内容. (4认同)

Cli*_*ord 7

这里有两个概念"静态链接(或范围)"和静态分配 ".

在函数外部,关键字指的是链接,里面指的是分配.函数外的所有变量都隐式地具有静态分配.也许是一个不幸的设计,但确实如此.


Sou*_*ity 5

C和C++是一样的.

static做了两件不同的事情.

对于在函数作用域外声明的变量,它会更改变量的可见性(链接).变量将是一个全局变量,因为它在函数范围之外.如果它不是静态的,它将具有通用链接(可见性),因此与此链接在一起的任何代码都可以访问它(它们可能必须将其声明为extern).如果变量在函数作用域之外并且是静态的,它仍然是一个全局变量,因为它始终存在并保持其值,但是在同一编译单元(.c文件和包含的任何.h)之外的代码都不能访问它.

对于在函数作用域内声明的变量,static会更改存储变量的位置.如果它不是静态的,它将是一个自动变量,这意味着它会在函数退出时消失,并在再次输入函数时重新出现(在堆栈中).退出函数时它会丢失它的值.并且在函数退出后,对它的任何引用(指向它)都是无效的.如果在函数作用域内声明的变量是静态的,那么它使它不是自动变量而是全局分配的变量.因此,变量将在函数退出后存在,因此将在函数的调用中保持其值,并且即使在函数退出之后,对它的任何引用(指针)也是有效的.请注意,在这两种情况下,变量的范围仅在该函数内,因此无法从函数范围外直接访问它(但仅通过保存的引用).

静态做的最后一件事是在运行变量的初始值设定项(即int foo = 5)时进行更改.对于分配是全局的所有情况(除了自动分配之外的每种情况),初始化程序仅在程序执行开始时运行一次.它在main()运行之前运行,因此如果初始化程序不仅仅是一个常数而是运行一些代码,那么你可以获得一些不太理想的结果.对于自动情况,每次输入函数时都会运行初始化程序,在这种情况下,它始终在输入main()之后运行.