c-静态全局变量和函数内部静态变量之间的差异



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

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

唯一的区别是,当变量在函数内部声明时,它只对该函数具有局部作用域。尽可能地缩小变量的范围总是一种很好的做法,所以如果这是可能的,你应该这样做

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

在某些情况下,将变量放在文件范围内是一种糟糕的编程做法,因为这会使代码更难读取和维护。这与为什么全局变量被认为是坏的问题是一样的,即使静态文件范围变量不是全局的(它对整个程序不可见)。

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

以下是一些经过调整的代码,用于显示之间的差异,中定义了变量:(来自:"静态"是什么意思?)

#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 = %dn", a, sa);
}
void func2()
{
    int a = 10;
    static int sa = 10;
    a += 5;
    sa += 5;
    printf(" func2 : a = %d, sa = %dn", 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 = %dn", a, sa);
}
void func2()
{
    int a = 10;
    //static int sa = 10;
    a += 5;
    sa += 5;
    printf(" func2 : a = %d, sa = %dn", 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

总结意见(来自原始参考资料):什么是";静态";意思是

  • 静态定义的局部变量在函数调用。换句话说,它们是全局变量,但作用域到它们在中定义的本地函数

  • 静态全局变量在C文件之外不可见,它们
    在.中定义

  • 静态函数在C文件之外不可见,它们是
    定义于.

相关内容

  • 没有找到相关文章

最新更新