在C语言中,static有3个作用:
(1)在函数体,一个被声明为静态的变量在这一函数体内被调用的过程中维持其值不变。
#include <stdio.h>void test(void)
{static int i = 0;printf("%d\n", i++);
}int main(void)
{test();test();test();return 0;
}
如果不使用static修饰 int i,结果为。使用后结果为。
(2)在模块内,一个被声明为静态的变量可以被模块内所有的函数访问,但不能被模块外其他函数访问。它是一个本地的全局变量。
在test.c里面声明一个全局变量
int a = 100;
在main.c中也声明一个全局变量
int a = 200;
编译器报错
因为a是非静态全局变量,作用域是整个源程序,而静态全局变量的作用域限制在定义该变量的源文件内有效。
test.c里面的变量修改为
static int a = 100;
编译通过。
(3)在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用,这个函数被限制在声明它的模块的本地范围内使用。
比如static_test.h 的内容为
#ifndef STATIC_TEST_H
#define STATIC_TEST_Hstatic void static_func(void);void func(void);#endif
static_test.c的内容为
#include "static_test.h"
#include <stdio.h>static void static_func(void)
{printf("hello world\n");
}void func(void)
{static_func();
}
在main.c中去调用static_func(),编译器会报错。而static_test.c里调用static_func()是可以的。从而说明static修饰的函数只能在模块static_test.c里面调用,不允许模块外调用。
头文件中static_func()不使用static修饰也可以编译通过,但是依照代码规范的要求,必须使用static修饰以增加阅读性,头文件使用static修饰表明了该函数不允许使用者调用。