我在C代码的不同地方看到过静态这个词;这是否像c#中的静态函数/类(实现是跨对象共享的)?
当前回答
从维基百科:
在C编程语言中,static与全局变量和函数一起使用,以将它们的作用域设置为包含文件。在局部变量中,static用于将变量存储在静态分配的内存中,而不是自动分配的内存中。虽然语言没有规定这两种类型内存的实现,但静态分配的内存通常在编译时保留在程序的数据段中,而自动分配的内存通常作为瞬态调用堆栈实现。
其他回答
人们总是说C语言中的“static”有两层含义。我提供了另一种看待它的方式,赋予它一个单一的含义:
对一个项目应用“static”会迫使该项目具有两个属性:(a)在当前范围外不可见;(b)它是持久的。
它似乎有两种含义的原因是,在C语言中,每个“static”可能应用的项都已经具有这两个属性之一,所以似乎这种特殊用法只涉及另一个。
例如,考虑变量。在函数外部声明的变量已经具有持久性(在数据段中),因此应用'static'只能使它们在当前作用域(编译单元)之外不可见。相反,在函数内部声明的变量在当前作用域(函数)之外已经具有不可见性,因此应用“static”只能使它们持久。
将“static”应用于函数就像应用于全局变量一样——代码必须是持久的(至少在语言中),所以只能改变可见性。
注意:这些注释只适用于C。在c++中,对类方法应用'static'是真正赋予关键字不同的含义。C99数组参数扩展也是如此。
函数中的静态变量在调用之间保持其值。 静态全局变量或函数只能在声明它的文件中“看到”
(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文件,它通常只向用户公开几个“公共”函数。其余的函数应该是静态的,这样用户就不能访问它们。这就是封装,一个很好的实践。
引用维基百科:
在C语言中,是静态的 与全局变量和 函数将其作用域设置为 包含文件。在局部变量中, Static用于存储变量 在静态分配的内存中 而不是自动分配 内存。而语言却没有 指定任意一种方法的实现 内存类型,静态分配 内存通常保留在数据中 编译时的程序段 时间,当自动 已分配内存正常 实现为一个瞬态调用堆栈。
回答你的第二个问题,它不像c#。
然而,在c++中,static也用于定义类属性(在同一类的所有对象之间共享)和方法。在C语言中没有类,所以这个特性无关紧要。
这里还有一种用法没有涉及,它是数组类型声明的一部分,作为函数的参数:
int someFunction(char arg[static 10])
{
...
}
在这个上下文中,它指定传递给这个函数的参数必须是char类型的数组,其中至少有10个元素。更多信息请看我的问题。
需要注意的是,函数中的静态变量在第一次进入该函数时被初始化,并且即使在调用结束后仍然存在;对于递归函数,静态变量只初始化一次,并且在所有递归调用中持续存在,甚至在函数调用结束后仍然存在。
如果变量是在函数外部创建的,则意味着程序员只能在声明变量的源文件中使用该变量。
一个静态变量值在不同的函数调用之间持续存在,它的作用域被限制在本地块 静态变量的初始值总是0