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

问题描述 投票:1回答:2

假设我有一个函数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()中只需要变量?

c static global-variables global
2个回答
4
投票

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

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

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

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


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文件之外是不可见的 定义于。
© www.soinside.com 2019 - 2024. All rights reserved.