C中的“静态”是什么意思?
我已经在C代码的不同地方看到了static
这个词; 这就像是C#中的静态函数/类(其中实现是跨对象共享的)?
(1)如果你是一个新手,是更多的外国话题,所以这里是一个例子:
#include <stdio.h>
void foo()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf("a = %d, sa = %dn", 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个元素。 欲了解更多信息,请参阅我的问题
简短的回答...... 这取决于。
静态定义的局部变量不会在函数调用之间失去它们的值。 换句话说,它们是全局变量,但是它们的作用域是它们所定义的本地函数。
静态全局变量在定义的C文件之外不可见。
静态函数在它们定义的C文件之外是不可见的。