static 和 extern 都是C语言中的关键字
static 是静态的的意思,可以用来:
1.修饰局部变量
2.修饰全局变量
3.修饰函数
extern是用来声明外部符号的
作用域和生命周期
作用域
作用域(scope) 是程序设计概念, 通常来说,一段程序代码中所用到的名字并不总是有效(可用) 的, 而限定这个名字的可用性的代码范围就是这个名字的作用域。
1. 局部变量的作用域是变量所在的局部范围。
2.全局变量的作用域是整个工程(项目)。
生命周期
生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。
1. 局部变量的生命周期是: 进入作用域变量创建,生命周期开始,出作用域生命周期结束。
2.全局变量的生命周期是:整个程序的生命周期。
结果为:
计算结果都为1是因为i是局部变量,进入函数创建,出函数就销毁
结果为:
出现该结果是因为static修饰了局部变量i
static修饰局部变量:
本质上影响了变量的存储类型,一个局部变量是存在栈区的,但是被static修饰后就存放在静态区了,因为存储类型的变化,生命周期跟着变化了,变长了
使用建议:
未来一个变量出了函数后,我们还想保留值等到下次进入函数时继续使用,就可以用static修饰
结论:
static修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来一个局部变量是存储在内存的栈区的,但是被 static修饰后存储到了静态区。存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期一样了,只有程序结束,变量才销毁,内存才回收。但是作用域不变的。
static修饰全局变量
extern是用来声明外部符号的,如果一个全局的符号在A文件中定义的,在B文件中想使用,就可以使用extern进行声明,然后使用
static修饰全局变量:
1. 首先要知道全局变量是具有外部链接属性的
2.全局变量被static修饰后,外部链接属性就变成了内部链接属性,就是这个全局变量只能在自己所在的. c文件中使用,其他文件看不到。
相当于作用域变小了。
static修饰函数:
1. 函数也是具有外部链接属性
2.但是被static修饰后,外部链接属性就变成了内部链接属性,这个函数只能在自己所在的. c文件中使用其他文件中及时声明了,也不能使用。
如: