【问题标题】:Difference between static global variable and static variable inside a function函数内部静态全局变量和静态变量的区别
【发布时间】:2016-07-26 14:56:15
【问题描述】:

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

【问题讨论】:

  • @ameyCU 这不是这个问题的目的。
  • @Lundin 我认为该问题的答案回答了这些。
  • 我只是对何时应该使用方法(1)以及何时使用(2)以及为什么;)感兴趣?
  • 如果你在函数中声明它,它将在函数范围内可用,否则它将在文件范围内可用......有时你不需要或不希望它在文件范围内......

标签: c static global-variables global


【解决方案1】:

唯一的区别是当变量在函数内部声明时,它只对那个函数有局部作用域。尽可能减少变量的范围始终是一种很好的做法,因此如果可能,您应该这样做。

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

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

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

【讨论】:

    【解决方案2】:

    这里是一些调整后的代码,用于显示变量定义的位置之间的差异: (来自: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
    

    摘要 cmets(来自原始参考): What does "static" mean?

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

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

    • 静态函数在它们所在的 C 文件之外不可见
      中定义。

    【讨论】:

    • 全局变量的正确定义是对整个程序全局可见的变量。因此,static 变量永远不可能是全局变量。不要将“全局”与“文件范围”混为一谈,它们是不同的术语。
    • 感谢您的更新,但这不是我想要的。问题是针对一个场景,当我在一个函数中使用 var 时。
    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多