我在C代码的不同地方看到过静态这个词;这是否像c#中的静态函数/类(实现是跨对象共享的)?
当前回答
静态变量是可以在函数中使用的特殊变量,它在调用之间保存数据,并且不会在调用之间删除数据。例如:
void func(void) {
static int count; // If you don't declare its value, it is initialized with zero
printf("%d, ", count);
++count;
}
int main(void) {
while(true) {
func();
}
return 0;
}
输出:
0, 1, 2, 3, 4, 5...
其他回答
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
有2种情况:
(1)声明为静态的局部变量:在数据段而不是堆栈中分配。当您再次调用该函数时,它的值仍然保留。
(2)声明为静态的全局变量或函数:不可见的外部编译单元(即链接时符号表中的局部符号)。
如果在静态函数中声明变量,其值将不会存储在函数调用堆栈中,并且在再次调用该函数时仍然可用。
如果将全局变量声明为static,则其作用域将限制在声明它的文件内。这比常规的全局变量稍微安全一些,后者可以在整个程序中读取和修改。
静态在不同的语境中有不同的含义。
你可以在C函数中声明一个静态变量。这个变量只在函数中可见,但它的行为像一个全局变量,因为它只初始化一次,并保留其值。在这个例子中,每次调用foo(),它都会输出一个递增的数字。静态变量只初始化一次。 Void foo () { 静态int I = 0; printf (" % d”,我);我+ + } static的另一种用法是在.c文件中实现一个函数或全局变量,但不希望它的符号在文件生成的.obj之外可见。如。 静态无效foo(){…}
这取决于:
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库中,所有“私有”函数都是静态的,而大多数“公共”函数不是静态的。