我在C代码的不同地方看到过静态这个词;这是否像c#中的静态函数/类(实现是跨对象共享的)?
当前回答
这里还有一种用法没有涉及,它是数组类型声明的一部分,作为函数的参数:
int someFunction(char arg[static 10])
{
...
}
在这个上下文中,它指定传递给这个函数的参数必须是char类型的数组,其中至少有10个元素。更多信息请看我的问题。
其他回答
简单的回答……视情况而定。
静态定义的局部变量不会在函数调用之间丢失它们的值。换句话说,它们是全局变量,但作用域是定义它们的局部函数。 静态全局变量在定义它们的C文件之外是不可见的。 静态函数在定义它们的C文件之外是不可见的。
在C语言中,static有两个含义,这取决于它的使用范围。在全局作用域中,当在文件级声明对象时,这意味着该对象仅在该文件中可见。
在任何其他作用域,它声明一个对象,该对象将在输入特定作用域的不同时间之间保留其值。例如,如果一个int在一个过程中被delcare:
void procedure(void)
{
static int i = 0;
i++;
}
在第一次调用过程时,'i'的值被初始化为零,并且在以后每次调用过程时保留该值。如果打印'i',它将输出一个0,1,2,3,…
需要注意的是,函数中的静态变量在第一次进入该函数时被初始化,并且即使在调用结束后仍然存在;对于递归函数,静态变量只初始化一次,并且在所有递归调用中持续存在,甚至在函数调用结束后仍然存在。
如果变量是在函数外部创建的,则意味着程序员只能在声明变量的源文件中使用该变量。
从维基百科:
在C编程语言中,static与全局变量和函数一起使用,以将它们的作用域设置为包含文件。在局部变量中,static用于将变量存储在静态分配的内存中,而不是自动分配的内存中。虽然语言没有规定这两种类型内存的实现,但静态分配的内存通常在编译时保留在程序的数据段中,而自动分配的内存通常作为瞬态调用堆栈实现。
有2种情况:
(1)声明为静态的局部变量:在数据段而不是堆栈中分配。当您再次调用该函数时,它的值仍然保留。
(2)声明为静态的全局变量或函数:不可见的外部编译单元(即链接时符号表中的局部符号)。