我在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...

其他回答

如果你在mytest.c文件中声明这个:

static int my_variable;

那么这个变量只能从这个文件中看到。该变量不能导出到其他任何地方。

如果在函数内部声明,则每次调用该函数时,变量的值将保持不变。

静态函数不能从文件外部导出。因此,在*.c文件中,如果将函数和变量声明为静态,则隐藏了它们。

人们总是说C语言中的“static”有两层含义。我提供了另一种看待它的方式,赋予它一个单一的含义:

对一个项目应用“static”会迫使该项目具有两个属性:(a)在当前范围外不可见;(b)它是持久的。

它似乎有两种含义的原因是,在C语言中,每个“static”可能应用的项都已经具有这两个属性之一,所以似乎这种特殊用法只涉及另一个。

例如,考虑变量。在函数外部声明的变量已经具有持久性(在数据段中),因此应用'static'只能使它们在当前作用域(编译单元)之外不可见。相反,在函数内部声明的变量在当前作用域(函数)之外已经具有不可见性,因此应用“static”只能使它们持久。

将“static”应用于函数就像应用于全局变量一样——代码必须是持久的(至少在语言中),所以只能改变可见性。

注意:这些注释只适用于C。在c++中,对类方法应用'static'是真正赋予关键字不同的含义。C99数组参数扩展也是如此。

有2种情况:

(1)声明为静态的局部变量:在数据段而不是堆栈中分配。当您再次调用该函数时,它的值仍然保留。

(2)声明为静态的全局变量或函数:不可见的外部编译单元(即链接时符号表中的局部符号)。

简单的回答……视情况而定。

静态定义的局部变量不会在函数调用之间丢失它们的值。换句话说,它们是全局变量,但作用域是定义它们的局部函数。 静态全局变量在定义它们的C文件之外是不可见的。 静态函数在定义它们的C文件之外是不可见的。

静态变量有一个特性,即使在它们超出作用域后也能保存它们的值!因此,静态变量在以前的作用域中保留它们以前的值,而在新的作用域中不再初始化。

看看这个例子 静态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)

这些是我发现的主要问题,上面没有为新手解释!