zoukankan      html  css  js  c++  java
  • 【翻译】C语言中的static的含义

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

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

    高赞回答:

    1. 函数中的静态(static)变量在调用期间保持它的值

    2. 静态(static)的全局变量/函数只在它声明的文件中可见

    (1) 如果你是小白,这似乎对你来说有点晦涩,下面这段代码能使你豁然开朗:

    #include <stdio.h>
    
    void foo()
    {
        int a = 10;
        static int sa = 10;
    
        a += 5;
        sa += 5;
    
        printf("a = %d, sa = %d
    ", a, sa);
    }
    int main()
    {
        int i;
    
        for (i = 0; i < 10; ++i)
            foo();
    }
    

    这将会输出:

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

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

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

    援引维基百科

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

    【译者注】:这段话在维基相关链接中已被更改,原文中没有这段内容了,但该段话是正确的。

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

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

  • 相关阅读:
    墙内正确安装docker和docker-compose的方法
    VS2015编译ncnn
    caffe模型转ncnn模型
    Ncnn-Installation-on-Windows
    CV2 Fourcc解析
    手动安装OpenCV下的IPP加速库
    Ubuntu下安装Caffe
    Linux安装CUDA教程参考
    最正确的姿势安装cudnn,网上大多数教程都太坑了
    安装多版本cuda时,nvcc和cuda版本不一致问题
  • 原文地址:https://www.cnblogs.com/Jaywhen-xiang/p/13689313.html
Copyright © 2011-2022 走看看