在c语言中,static是一个非常常见的关键字,它主要用于定义静态变量、静态函数和静态全局变量。需要注意的是,static并不能对自动变量(也就是局部变量)起到任何作用。
静态变量的定义方式为:在函数内部或代码块内部定义一个局部变量,并在变量名前加上static关键字即可。与普通变量相比,静态变量的生命周期更长,它的值会被一直保留,直到程序结束。
静态函数在定义时也需要加上static关键字,它的作用主要是为了内部调用。静态函数只能在定义它的源文件(c文件)中被调用,不能被其他源文件直接调用,这就保证了函数的安全性,并可以防止命名冲突。
静态全局变量的定义方式与静态变量类似,但需要定义在函数外部,它的作用域只限于当前源文件,其他源文件无法访问它,也能够避免命名冲突。
静态变量的主要应用有两种情况:
在函数内部定义一个静态变量,每次函数被调用时,静态变量的值都会被保留。可以利用这个特性来实现计数器的功能。例如,可以通过静态变量来记录函数被调用的次数,代码如下:
```c
int count() {
static int cnt = 0;
cnt++;
return cnt;
```
在函数内部定义一个用const修饰的静态变量,可以避免在每次调用函数时都重新计算常量的值,以提高程序的运行效率。例如,可以用静态变量来缓存计算过的斐波那契数列,代码如下:
```c
int fibonacci(int n) {
static const int MAX_N = 50;
static int fibo[MAX_N] = {0, 1};
static int i = 2;
while (i < n) {
fibo[i] = fibo[i-1] + fibo[i-2];
i++;
}
return fibo[n-1];
```
静态函数的作用主要是为了内部调用,也就是限制函数的作用域,避免命名冲突,并可以保证函数的安全性。静态函数的应用场景较多,常用于以下几种情况:
在编写程序时,有时需要定义一些辅助函数来支持主要功能的实现。这些函数只在本文件中被使用,可以用static来修饰它们,以避免与其他文件中同名的函数发生冲突。例如:
```c
static int get_sum(int a, int b) {
return a + b;
```
有些函数只能在特定条件下才能被调用,为了防止函数被意外或错误地调用,可以将它们定义为静态函数。静态函数只能在定义它的源文件中被调用,避免了函数被错误调用的情况。例如:
```c
static void init() {
// 只能在这个文件中被调用
```
静态全局变量的作用域只在当前源文件中,其他源文件无法访问它,也能够避免命名冲突。它主要适用于以下情况:
在一些场景中,需要对某些全局状态进行保存。这时可以使用静态全局变量,在函数间传递状态,以达到保存全局状态的目的。
在程序的初始化和退出阶段,有时需要按照一定顺序执行一些函数。这时可以使用静态全局变量结合函数指针,控制函数的调用顺序。
例如,在程序初始化时希望先执行init1函数,再执行init2函数,代码如下:
```c
static int initialized = 0;
static void init1() {
// do something
static void init2() {
// do something
static void (* const init_funcs[])() = { init1, init2 };
void init() {
if (!initialized) {
for (int i = 0; i < sizeof(init_funcs) / sizeof(init_funcs[0]); i++) {
init_funcs[i]();
}
initialized = 1;
}
```