协慌网

登录 贡献 社区

“静态” 在 C 中意味着什么?

我在 C 代码中看到过static使用的单词; 这就像 C#中的静态函数 / 类(其中实现是跨对象共享的)?

答案

  1. 函数内的静态变量在调用之间保持其值。
  2. 静态全局变量或函数仅在其声明的文件中 “看到”

如果你是新手,(1)是更多的外国话题,所以这是一个例子:

#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();
}

这打印:

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)广泛用作 “访问控制” 功能。如果您有. c 文件实现某些功能,它通常只向用户公开一些 “公共” 功能。其余的功能应该是static ,这样用户就无法访问它们。这是封装,一个很好的做法。

引用维基百科

在 C 编程语言中,static 与全局变量和函数一起使用,以将其范围设置为包含文件。在局部变量中,static 用于将变量存储在静态分配的内存中,而不是自动分配的内存中。虽然该语言没有规定任何类型的存储器的实现,但是静态分配的存储器通常在编译时保留在程序的数据段中,而自动分配的存储器通常被实现为瞬态调用栈。

有关详细信息,请参见此处此处

并回答你的第二个问题,它不像在 C#中。

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

还有一个用途未在此处介绍,它作为数组类型声明的一部分作为函数的参数:

int someFunction(char arg[static 10])
{
    ...
}

在此上下文中,它指定传递给此函数的参数必须是char类型的数组,其中至少包含 10 个元素。有关详情,请在此处查看我的问题。

简短回答...... 这取决于。

  1. 静态定义的局部变量在函数调用之间不会丢失它们的值。换句话说,它们是全局变量,但是作用于它们定义的局部函数。

  2. 静态全局变量在定义它们的 C 文件之外是不可见的。

  3. 静态函数在定义它们的 C 文件之外是不可见的。