我在C代码的不同地方看到过静态这个词;这是否像c#中的静态函数/类(实现是跨对象共享的)?
当前回答
这取决于:
int foo()
{
static int x;
return ++x;
}
函数将返回1,2,3,等等——变量不在堆栈上。
a.c:
static int foo()
{
}
这意味着该函数仅在该文件中有作用域。因此a.c和b.c可以有不同的foo(),并且foo不会暴露给共享对象。所以如果你在ac中定义了foo你就不能从bc或其他地方访问它。
在大多数C库中,所有“私有”函数都是静态的,而大多数“公共”函数不是静态的。
其他回答
在C语言中,static有两个含义,这取决于它的使用范围。在全局作用域中,当在文件级声明对象时,这意味着该对象仅在该文件中可见。
在任何其他作用域,它声明一个对象,该对象将在输入特定作用域的不同时间之间保留其值。例如,如果一个int在一个过程中被delcare:
void procedure(void)
{
static int i = 0;
i++;
}
在第一次调用过程时,'i'的值被初始化为零,并且在以后每次调用过程时保留该值。如果打印'i',它将输出一个0,1,2,3,…
如果在静态函数中声明变量,其值将不会存储在函数调用堆栈中,并且在再次调用该函数时仍然可用。
如果将全局变量声明为static,则其作用域将限制在声明它的文件内。这比常规的全局变量稍微安全一些,后者可以在整个程序中读取和修改。
从维基百科:
在C编程语言中,static与全局变量和函数一起使用,以将它们的作用域设置为包含文件。在局部变量中,static用于将变量存储在静态分配的内存中,而不是自动分配的内存中。虽然语言没有规定这两种类型内存的实现,但静态分配的内存通常在编译时保留在程序的数据段中,而自动分配的内存通常作为瞬态调用堆栈实现。
一个静态变量值在不同的函数调用之间持续存在,它的作用域被限制在本地块 静态变量的初始值总是0
静态变量有一个特性,即使在它们超出作用域后也能保存它们的值!因此,静态变量在以前的作用域中保留它们以前的值,而在新的作用域中不再初始化。
看看这个例子 静态int变量在程序运行时保留在内存中。当声明变量的函数调用结束时,普通变量或自动变量将被销毁。
#include<stdio.h>
int fun()
{
static int count = 0;
count++;
return count;
}
int main()
{
printf("%d ", fun());
printf("%d ", fun());
return 0;
}
这将输出:12
As 1保留在内存中,因为它被声明为静态
静态变量(如全局变量)如果没有显式初始化,则初始化为0。例如,在下面的程序中,x的值被打印为0,而y的值是垃圾。更多细节请参见此。
#include <stdio.h>
int main()
{
static int x;
int y;
printf("%d \n %d", x, y);
}
这将输出:0 (some_garbage_value)
这些是我发现的主要问题,上面没有为新手解释!