static
代码1的test函数中的局部变量i是每次进⼊test函数先创建变量(⽣命周期开始)并赋值为0,然后 ++,再打印,出函数的时候变量⽣命周期将要结束(释放内存)。
代码2中,我们从输出结果来看,i的值有累加的效果,其实 test函数中的i创建好后,出函数的时候是 不会销毁的,重新进⼊函数也就不会重新创建变量,直接上次累积的数值继续计算
结论:static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才 回收。但是作⽤域不变的。
extern
是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使 ⽤ extern 进⾏声明,然后使⽤。 代码1正常,代码2在编译的时候会出现链接性错误。
全局变量默认带有外部链接属性的
static int cl = 521;
//static 修饰全局变量的时候,改变了全局变的链接属性,使得外部链接
//成为内部接,这种变量只能在自己的 .c文件使用,别的无法使用
#include <stdio.h>
int main()
{
extern int cl;//extern 在这里是可以跨文件使用的
printf("%d ", cl);
return 0;
}
使⽤建议:⼀个函数只想在所在的源⽂件内部使⽤,不想被其他源⽂件使⽤,就可以使⽤ static 修 饰。
函数也是具有外部链接属性, 即使static修饰函数变量也是只能在本.c文件中使用