c-static

2020-09-18

这是我之前在博客园写的文章,现在搬运过来,博客园文章地址

原文链接:what-does-static-mean-in-c

Question: 我在C代码的不同位置都看到过static这个关键字;它是否与C#中的静态方法/类类似呢? (实现在对象之间共享)

高赞回答:

  • 函数中的静态(static)变量在调用期间保持它的值
  • 静态(static)的全局变量/函数只在它声明的文件中可见
  • 如果你是小白,这似乎对你来说有点晦涩,下面这段代码能使你豁然开朗:
  • c
    #include <stdio.h>
    void foo(){
        int a = 10;    
        static int sa = 10;
        a += 5;
        sa += 5;
        printf("a = %d, sa = %d\n", a, sa);
    }
    int main(){
        int i;
        for (i = 0; i < 10; ++i)
            foo();
    }

    这将会输出:

    plain text
    a = 15, sa = 15a = 15, sa = 20a = 15, sa = 25a = 15, sa = 30a = 15, sa = 35a = 15, sa = 40a = 15, sa = 45a = 15, sa = 50a = 15, sa = 55a = 15, sa = 60

    这在函数需要在多次调用之间保持某些变量的值不被销毁并且你不想使用全局变量时十分有用,但是需要谨慎考虑,(因为)它会使你的代码不是线程安全的,并且难以理解。

    (2)static的第二种用法是“访问控制”。如果你有一个.c文件实现了一些功能,它通常仅向用户暴露一些公用的函数。其余的函数应该用static来修饰,以便使用户无法访问它们。这是封装,一种好的习惯。

    援引维基百科

    在C语言中,static与全局变量和函数一起使用以将其范围(可见性)设置为当前文件。 在局部变量中,static用于将变量存储在静态分配的内存中,而不是自动分配的内存中。 虽然该语言不指示哪种类型的内存的实现,但是静态分配的内存通常在编译时保留在程序的数据段中,而自动分配的内存通常实现为瞬时调用堆栈。

    顺便回答你的第二个问题,static在C中的含义与C#不同。

    然而,在C++中,static也用来定义类的属性(在同一类对象之间共享)和方法,在C中没有类,所以该功能无关紧要。