静态全局变量和函数内部静态变量的区别

xy3*_*y36 2 c static global global-variables

假设我有一个函数,并且我使用该函数内部的void func()变量。testVar另外,我需要变量在离开函数后仍然存在。通常我会通过在函数内部使用静态变量来做到这一点(1)。但是,当我使用全局变量时,有什么区别(2)?

static int testVar = 0; //global variable instead(2)

void func()
{
    static int testVar = 0; //static variable inside of the function(1)

    if(testVar++){
        //do something
    }   
}
Run Code Online (Sandbox Code Playgroud)

编译器在这两种情况下具体做了什么?如果仅需要该变量,是否存在应该使用方法(2)的情况func()

Lun*_*din 5

唯一的区别是,当变量在函数内部声明时,它仅具有该函数的局部作用域。尽可能缩小变量的范围始终是一种好的做法,因此如果可能的话,您应该这样做。

尽管有时在实现ADT和类似模块时,您希望多个函数可以访问局部变量。在这种情况下,您可以在文件范围内声明它。

在某些情况下,将变量放在文件范围内是不好的编程习惯,因为它使代码更难以阅读和维护。这与为什么全局变量被认为是坏的问题相同,即使静态文件作用域变量不是全局的(整个程序不可见)。

在其他情况下,尤其是嵌入式系统,您正在编写的“类”只有一个实例(单例),那么使用文件范围静态变量是常见的做法,作为一种穷人进行私有封装的方式。