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

时间:2016-04-06 09:37:26

标签: c static global-variables global

假设我有一个函数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
    }   
}

编译器在两种情况下都做了哪些详细的处理?是否存在我应该使用方法(2)的情况,只要func()只需要变量?

2 个答案:

答案 0 :(得分:4)

唯一的区别是当变量在函数内部声明时,它只具有该函数的局部范围。尽可能减少变量的范围总是很好的做法,所以如果可行的话,你应该这样做。

虽然有时在实现ADTs和类似模块时,您希望多个函数可以访问局部变量。在这种情况下,您将其声明为文件范围。

在某些情况下,将变量放在文件范围是不好的编程习惯,因为它会使代码更难以阅读和维护。即使静态文件范围变量不是全局变量(整个程序也看不到),这与全局变量被认为是错误的原因相同。

在其他情况下,最显着的是嵌入式系统,其中只有一个"类"你正在编写(单例),然后使用文件范围静态变量是常见的做法,作为一个穷人的私有封装方式。

答案 1 :(得分:1)

这里有一些调整后的代码,用于显示定义变量的区别: (来自:What does "static" mean?

#include <stdio.h>

//static int sa = 10;

void func1()
{
    int a = 10;
    static int sa = 10;

    a += 5;
    sa += 5;

    printf("func 1: a = %d, sa = %d\n", a, sa);
}

void func2()
{
    int a = 10;
    static int sa = 10;

    a += 5;
    sa += 5;

    printf(" func2 : a = %d, sa = %d\n", a, sa);
}


int main()
{
    int i,j;

    for (i = 0; i < 10; ++i){
        func1();
    }

    for (j = 0; j < 10; j++)
    {
        func2();
    }
}
  

产生

func 1: a = 15, sa = 15
func 1: a = 15, sa = 20
func 1: a = 15, sa = 25
func 1: a = 15, sa = 30
func 1: a = 15, sa = 35
func 1: a = 15, sa = 40
func 1: a = 15, sa = 45
func 1: a = 15, sa = 50
func 1: a = 15, sa = 55
func 1: a = 15, sa = 60
 func2 : a = 15, sa = 15
 func2 : a = 15, sa = 20
 func2 : a = 15, sa = 25
 func2 : a = 15, sa = 30
 func2 : a = 15, sa = 35
 func2 : a = 15, sa = 40
 func2 : a = 15, sa = 45
 func2 : a = 15, sa = 50
 func2 : a = 15, sa = 55
 func2 : a = 15, sa = 60
  

,而

#include <stdio.h>

static int sa = 10;

void func1()
{
    int a = 10;
//  static int sa = 10;

    a += 5;
    sa += 5;

    printf("func 1: a = %d, sa = %d\n", a, sa);
}

void func2()
{
    int a = 10;
    //static int sa = 10;

    a += 5;
    sa += 5;

    printf(" func2 : a = %d, sa = %d\n", a, sa);
}
  

产生

func 1: a = 15, sa = 15
func 1: a = 15, sa = 20
func 1: a = 15, sa = 25
func 1: a = 15, sa = 30
func 1: a = 15, sa = 35
func 1: a = 15, sa = 40
func 1: a = 15, sa = 45
func 1: a = 15, sa = 50
func 1: a = 15, sa = 55
func 1: a = 15, sa = 60
 func2 : a = 15, sa = 65
 func2 : a = 15, sa = 70
 func2 : a = 15, sa = 75
 func2 : a = 15, sa = 80
 func2 : a = 15, sa = 85
 func2 : a = 15, sa = 90
 func2 : a = 15, sa = 95
 func2 : a = 15, sa = 100
 func2 : a = 15, sa = 105
 func2 : a = 15, sa = 110

摘要评论(来自原始参考文献): What does "static" mean?

  • 静态定义的局部变量之间不会丢失它们的值 函数调用。换句话说,它们是全局变量,但是作用域 到他们定义的本地函数。

  • 静态全局变量在他们的C文件之外是不可见的 在。

  • 中定义
  • 静态函数在C文件的外部不可见 定义于。