我在C代码的不同地方看到过静态这个词;这是否像c#中的静态函数/类(实现是跨对象共享的)?
当前回答
在C语言中,static有两个含义,这取决于它的使用范围。在全局作用域中,当在文件级声明对象时,这意味着该对象仅在该文件中可见。
在任何其他作用域,它声明一个对象,该对象将在输入特定作用域的不同时间之间保留其值。例如,如果一个int在一个过程中被delcare:
void procedure(void)
{
static int i = 0;
i++;
}
在第一次调用过程时,'i'的值被初始化为零,并且在以后每次调用过程时保留该值。如果打印'i',它将输出一个0,1,2,3,…
其他回答
在C语言中,static有两个含义,这取决于它的使用范围。在全局作用域中,当在文件级声明对象时,这意味着该对象仅在该文件中可见。
在任何其他作用域,它声明一个对象,该对象将在输入特定作用域的不同时间之间保留其值。例如,如果一个int在一个过程中被delcare:
void procedure(void)
{
static int i = 0;
i++;
}
在第一次调用过程时,'i'的值被初始化为零,并且在以后每次调用过程时保留该值。如果打印'i',它将输出一个0,1,2,3,…
在C编程中,static是一个保留关键字,它控制生存期和可见性。如果我们在函数中将变量声明为静态变量,那么它将只在整个函数中可见。在这种用法中,该静态变量的生命周期将在函数调用时开始,并在函数执行后终止。示例如下:
#include<stdio.h>
int counterFunction()
{
static int count = 0;
count++;
return count;
}
int main()
{
printf("First Counter Output = %d\n", counterFunction());
printf("Second Counter Output = %d ", counterFunction());
return 0;
}
上面的程序会给我们这样的输出:
First Counter Output = 1
Second Counter Output = 1
因为一旦我们调用这个函数,它就会初始化count = 0。当我们执行counterFunction时,它会销毁count变量。
从维基百科:
在C编程语言中,static与全局变量和函数一起使用,以将它们的作用域设置为包含文件。在局部变量中,static用于将变量存储在静态分配的内存中,而不是自动分配的内存中。虽然语言没有规定这两种类型内存的实现,但静态分配的内存通常在编译时保留在程序的数据段中,而自动分配的内存通常作为瞬态调用堆栈实现。
如果你在mytest.c文件中声明这个:
static int my_variable;
那么这个变量只能从这个文件中看到。该变量不能导出到其他任何地方。
如果在函数内部声明,则每次调用该函数时,变量的值将保持不变。
静态函数不能从文件外部导出。因此,在*.c文件中,如果将函数和变量声明为静态,则隐藏了它们。
C语言中的静态变量具有程序的生命周期。
如果在函数中定义,则它们具有局部作用域,即只能在这些函数中访问它们。静态变量的值在函数调用之间保留。
例如:
void function()
{
static int var = 1;
var++;
printf("%d", var);
}
int main()
{
function(); // Call 1
function(); // Call 2
}
在上面的程序中,var存储在数据段中。它的生命周期是整个C程序。
函数调用1后,var变为2。函数调用2后,var变为3。
var的值不会在函数调用之间被销毁。
如果var在非静态变量和局部变量之间,它将被存储在C程序的堆栈段中。由于函数的堆栈帧在函数返回后被销毁,因此var的值也被销毁。
初始化的静态变量存储在C程序的数据段中,而未初始化的静态变量存储在BSS段中。
关于静态的另一个信息:如果一个变量是全局的并且是静态的,那么它具有C程序的生命周期,但是它具有文件作用域。它只在该文件中可见。
试试这个:
file1.c
static int x;
int main()
{
printf("Accessing in same file%d", x):
}
file2.c
extern int x;
func()
{
printf("accessing in different file %d",x); // Not allowed, x has the file scope of file1.c
}
run gcc -c file1.c
gcc -c file2.c
现在试着把它们连接起来:
gcc -o output file1.o file2.o
它会给出一个链接器错误,因为x的文件作用域是file1.c,而链接器将无法解析file2.c中使用的对变量x的引用。
引用:
http://en.wikipedia.org/wiki/Translation_unit_(编程) http://en.wikipedia.org/wiki/Call_stack