1,static修饰局部变量
无static
static修饰的局部变量
作用域(限定这个名字的可用性的代码范围)
局部变量的作用域在函数代码块内,即变量所在的局部范围,static修饰后仍然是局部变量作用域不变
根本原因(存储位置改变,执行效果不一样)
普通的局部变量存储在栈区
存储位置改变,在静态区
生命周期(变量从创建到销毁的一个时间段)
局部变量进入作用域生命周期开始,出作用域生命周期结束
生命周期边长,变量创建后,之后不再执行变量初始化那句话了,变量直到程序结束才销毁
2,static修饰全局变量
无static
static修饰的全局变量
根本原因
全局变量本身具有外部链接属性,A文件定义,B文件链接使用,用extern声明外部符号
全局变量的外部连接属性变成内部链接属性,只能在自己的文件使用,别的文件看不到了,extern没用了,一个无法解析的外部符号
作用域(一段程序代码中所用的名字并不总是有效可用的,作用域是限定这个名字的可用性的代码范围)
全局变量的作用域是整个工程,项目,可以用extern声明
全局变量的作用域变小了
外部连接属性:一个工程只能生成一个可执行程序,test.c源文件在经过编译和链接后,会生成可执行程序后缀.exe,在链接的过程中就是在其他文件中找需要的符号。
3,修饰函数
根本原因:函数本身具有外部连接属性,static修饰导致外部链接属性变成内部链接属性,导致了static修饰的函数作用域变小了。
最后,总结static三种用法:(因为static修饰全局变量和函数的原因是同一个,我们可以合并理解)
原因
用法
static修饰局部变量
static修饰局部变量时,根本原因是局部变量的存储位置由栈区到了静态区,导致static修饰的局部变量生命周期边长。
当我们函数的局部变量想产生累计的效果,每次进入函数时,变量的值不被重新初始化,而是上次使用过后的值,我们可以用static修饰函数内的局部变量。
static修饰全局变量和函数
而static修饰全局变量和函数时,根本原因都是因为他们的外部连接属性变成了内部链接属性,导致他们的作用域变小,从而产生无法解析的外部符号的警告。
当我们只想在当前文件使用全局变量和函数时,不想被其他文件看见时,可以用static修饰全局变量和函数。