C语言 作用域、存储期、链接属性
作用域和链接描述了标识符的可见性,作用域描述了这些标识符的作用范围,存储期描述了通过这些标识符访问的对象的生存期。
1、作用域
块作用域:用{}阔起来的,从声明开始到“}” 结束
函数作用域:goto(标识符) 的作用域为整个函数。
函数原型作用域:函数声明开始,函数声明结束而结束
文件作用域:整个文件或者程序
2、链接
无链接:即只在其作用域内可见
内链接:即在从声明到文件结束都是可见的
外链接 :多个文件或者整个程序都可见
3、存储期
静态存储期:在整个程序都是占有内存的
线程存储期:thread_local,其声明后会给每个线程分配一个单独的私有备份
自动存储期:局部变量通常都自动为auto 存储期
动态存储期:就是用new 或者malloc分配的内存,如果不主动释放,在整个程序都占有内存
4、总结
存储类别 存储期 作用域 链接属性 表示
自动 自动 块 无链接 块内声明变量
寄存器 自动 块 无链接 块内使用register修饰
静态外链接 静态 文件 外链接 所有函数外
静态内链接 静态 文件 内链接 所有函数外,用static修饰
静态无链接 静态 块 无链接 块内,使用static修饰
线程存储 自动 线程 无链接 thread_local修饰
4、函数的存储期
外部函数:默认都是外部函数
静态函数:使用static 修饰,内连接
内联函数:inline
5、注意
- auto 在c中表示自动存储期, 但是auto在c++11 中表示自动推断类型
- register 声明后,并不一定会存到寄存器中,他只是一种请求。及时不存在寄存器中也不能对其取地址。同时可以存为register的类型可不多, 因为有些类型太大了,寄存器存不下。寄存器变量是储存在CPU的寄存器中,比普通变量能更快地被访问和处理,和自动变量一样,都是块作用域、无链接和自动储存期。
- 静态变量或者全局常量,都存储在静态区,在程序载入时已经执行赋值了 ,他们如果不被初始化,将会被初始化为0,存在bss段中。
4)如果对象具有静态存储期,那么它在程序的执行期间一直存在。文件作用域变量具有静态存储期。注意,对于文件作用域变量,关键字static表明了其链接属性,而非存储期。以static声明的文件作用域变量具有内部链接。但是无论是内部链接还是外部链接,所有的文件作用域变量都具有静态存储期。
6、申请内存
malloc:malloc(sizeof(xxx))
calloc:calloc(num,sizeof(xx))
realloc: realloc(p,size)
7、限定符
volatile
const:
restrict: