首页 > 代码库 > 储存类生命周期链接属性作用域总结

储存类生命周期链接属性作用域总结

储存类:变量在定义时的储存类型对其在程序中的生命周期、连接属性及作用域有很大的关联
链接属性: 无连接、内连接、外链接
关键字:
1、auto    用于修饰局部变量,在定义局部变量时,将其定义在栈上。
普通局部变量存放在栈上,因为栈内存的特性决定了普通局部变量定时如果未初始化其的值是随机的,因为栈内存是脏的,变量在释放后并未对其初始化,且栈内存被广泛运用,也就造就了普通变量的特性。
普通局部变量的生命周期是临时,可从其存放于栈上看出其临时的特性。
普通局部变量的作用域为代码块中“{}",C89与C99略有不同,普通局部变量在代码块的首部被定义,在代码块中被运用,在代码块结尾处被释放。

2、static    该关键字有两种作用,1、用于修饰静态局部变量 2、用于修饰全局变量或者函数,
且这两种作用之间无任何的相关性,相互独立的存在。
static修饰的局部变量为静态局部变量,其与普通局部变量不同,并不存放在栈上,而是存放在数据段/bss段(显式初始化为非0则在数据段,显式初始化为0或未显示初始化则在bss段)上,同样的因其存放在数据段上也就决定了其的生命周期并不是临时的而是永久的。但静态局部变量与普通局部变量也存在相似性,静态局部变量的作用域仍为代码块,且其连接属性依旧为无连接。
static修饰的全部变量/函数为静态全局变量/函数,其作用域的文件范围,生命周期为永久,连接属性因其只能在自身的文件内部被调用所以连接属性为内连接。

3、register  该关键字修饰的变量分配于寄存器中,降存放于寄存器中的变量可大大提高读取速度,但寄存器是有限的,
且经常性的被系统本身使用,故谨慎使用该关键字。

4、extern  该关键字用来全局声明变量/函数,声明后的全局变量及函数可在别的文件中被调用(前提是包含了该文件的.h文件),
作用域变更为全文件,链接属性为外链接。

5、volatile 其意思为可变的,在C语言中定义变量时加上该关键字,即可告诉编译器该变量可被编译器以外的代码改变,编译器之内的意思是变量的值的改变是代码的作用,编译器之外的改变就是这个改变不是代码造成的,或者不是当前代码造成的,编译器在编译当前代码时无法预知。譬如在中断中对变量的操作就必须加上该关键字,防止编译器对代码进行了错误的优化。

6、restrict  restrict只用来修饰指针,不能修饰普通变量。

7、typedef  

存储类决定生命周期,作用域决定链接属性
宏和inline函数的链接属性为无连接。


储存类生命周期链接属性作用域总结