用法1:在一个函数体内使用static定义一个变量,保证该变量只进行一次初始化
例:#include "stdio.h"
int test(void)
{
static int i=0; //对应 int i=0 结果为i=1 i=1 i=1 i=1 i=1
i++;
return i;
}
int main( )
{
for(int j=0;j<5;j++)
printf("test=%d\n",test());
return 0;
}
输出结果:i=1 i=2 i=3 i=4 i=5
用法2:在模块内,函数体外声明的static变量,只能被模块内函数调用,而模块是无效的(其中模块即:一个.c文件和一个.h文件的 结合,其中在STM32单片机C设计中经常使用)。同样的一个在模块内被声明为static的函数也只能在模块内被其它函数调 用,而模块外是无权调用的。一句话总结就是保护一些不能被其它文件访问的全局变量和函数;防止了不同人定义的文件变 量名和函数名的重复引起的错误
例://file1.cpp
int VarA=0;
static int VarB=0;
extern void FunB(void) //其中函数前面加extern表示定义为外部函数,其实可以省略,因为C语言默认省略为外部可 //调用
{
;
}
static int FunA (void) //加了static为静态函数,只能在本模块使用
{
int i=0;
i++;
return i;
}
//file2.cpp
extern int VarA; //可以
extern int VarB;//错误,为静态变量
extern int FunB;//可以
extern int FunA;//错误,为静态函数
总结:众所周知局部变量在存储方式上可以分为auto (默认的,可省略) static register这3种 其中auto是分配在栈上,占用动态存储空间,在函数调用结束后自动释放;static 分配在静态存储空间,两者的作用域相同,但是生存周期不同,static在所处模块初期初始化一次,其后不再进行初始化,同时如果没有初始化则默认是0或者空字符,但是auto的无初始化的值是随机的数;其中针对C++系统不管是否有static修饰都会调用默认构造函数进行初始化。