static
代码编译报错:虽然static修饰的变量其生命周期变长,即使函数调用结束,但是变量val并不会被回收,其值不变。但是即使这样并以意味着add函数内部声明的变量val可以在main函数内部访问,外部函数不能直接访问。
修饰局部变量
当static修饰局部变量时,该变量的生命周期变长,即使函数调用结束该变量依然不会被回收。这是因为在函数调用时,OS会为该函数在栈区内分配空间,函数的局部变量被创建并存储在栈区内,而当函数返回时,局部变量所占的栈内存也会被回收(例如上述左半图所示,未被static修饰的局部变量val的值在add函数调用结束后就会被回收)。
而当局部变量被static修饰的时候,该变量就不再存储在栈区上了,而是转到静态区,而静态区的变量在程序的整个执行期间都是存在的,不会被自动回收,因此当static修饰局部变量时,整个程序的运行期间该变量都会存在(例如上述右半图,static修饰的局部变量val,就是在add函数调用结束后,其值也不会被系统回收)。
修饰全局变量
如上所示,当val未被static修饰时,main函数是可以访问到val的;而当val被static修饰时,此时val无法被main访问。一个全局变量被static修饰的时候,他只能在当前源文件被访问,超出该源文件就无法被访问。
全局变量具有外部链接属性,因此一个源文件定义的变量可以通过extern来访问到;而当statix修饰全局变量时,他的外部连接属性就会变为内部链接属性,因此他只能在其所在的源文件内访问。
这里extern作用是表明当前val并没有在main所在的源文件内定义,系统会在其他源文件中寻找val。
修饰函数
同static修饰全局变量的特性类似,static修饰函数时,函数的外部链接属性变为内部链接属性,此时函数只能在当前源文件内部访问。