static 和 extern 都是C语⾔中的关键字。
static 是 静态的 的意思,可以⽤来:
• 修饰局部变量
• 修饰全局变量
• 修饰函数
extern 是⽤来声明外部符号的。
1.生命周期
⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
1. 局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束。
2. 全局变量的⽣命周期是:整个程序的⽣命周期。
2.作用域
作⽤域(scope)是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤)的,⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。
1. 局部变量的作⽤域是变量所在的局部范围。
2. 全局变量的作⽤域是整个⼯程(项⽬)。这个我们可以通过举例实现:
ps:当局部变量和全局变量名字相同时,优先使用局部变量;
对于全局变量来说,整个程序就是它的作用区域;定义在大括号外面的就是不一定是全局变量,比如上面的i,它其实也是局部变量,但是它的作用域是整个main函数;
总结:
以上我们可以发现,局部变量的生命周期是从它创建开始,出作用域结束;
全局变量的生命周期其实就是整个程序;
3.static和extern
3.1修饰局部变量
这里我们来看一段代码:
#include <stdio.h> void test() { int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<5; i++) { test(); } return 0; }
这段代码最后的结果是打印5个1;
我们知道,test里面的变量i是一个局部变量,进入这个函数创建一次i,出函数销毁;所以即使循环了5次,tesr函数也在重复创建i,i++这个步骤;
如果我们给i加上static呢?
#include <stdio.h> void test() { static int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<5; i++) { test(); } return 0; }
这个时候我们运行程序发现打印了1 2 3 4 5;
好像i一直都存在没有给销毁;
因为static修饰局部变量实际上是改变了它的储存类型,原本一个局部变量应该存放在栈区,
但是static将它存储在了静态区,变相延长路它的生命周期,但它的本质还是局部变量,使用范围还在test函数里;
ps:存储在静态区的变量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才回收。
3.2修饰全局变量
static修饰全局变量一般用于多个文件中;
extern 是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使⽤ extern 进⾏声明,然后使⽤。
这里我们可以看到一个全局变量定义在另外一个项目文件里面想要使用也是有办法的;全局变量是默认具有外部链接属性的;
如果我们在变量前面加上static:
这个时候编译器就会报错;
因为static去修饰全局变量时,将全局变量所具有的外部链接属性转为了内部链接属性,使得i只能在它所在的项目文件中使用;即使引用了外部符号也是没有用的;
3.3修饰函数
其实static修饰函数和全局变量差不多,函数也是具有外部链接属性的;
我们要使用别的项目文件的函数的时候可以用extern引用;
但是如果我们在函数前面加上static,函数也被转变为了内部链接属性,只能在函数所在的项目文件中使用;