存储类别 | 存储期 | 作用域 | 链接 | 声明方式 |
---|---|---|---|---|
自动 | 自动 | 块 | 无 | 块内 |
寄存器 | 自动 | 块 | 无 | 块内,使用关键字register |
静态外部链接 | 静态 | 文件 | 外部 | 所有函数外 |
静态内部链接 | 静态 | 文件 | 内部 | 所有函数外,使用关键字static |
静态无链接 | 静态 | 块 | 无 | 块内,使用关键字static |
若对存储期不了解,可点击此处(正在施工)。若对作用域不了解,可点击此处。 若对链接不了解,可点击此处(正在施工)。
常用的存储类别标识符有:auto、register、static、extern、_Thread_local(与线程存储期有关,虽然我不常用,但我还是想“一家人就要整整齐齐”)
在这里只介绍前4个。
关键字static和extern的含义取决于上下文。既然它俩比较特殊,那就先从它俩开始谈吧。
- 用static说明符创建的对象具有静态储存期,载入程序时创建对象,程序结束时对象消失。如果static用于文件作用域声明,作用域受限于该文件。如果static用于块作用域声明,作用域则受限于该块。因此,只要程序在运行对象就存在并保留其值,但是只有在执行块内代码时才能通过标识符访问。块作用域的静态变量无链接。文件作用域的静态变量具有内部链接。
- extern说明符表明声明的变量定义在别处。如果包含extern声明具有文件作用域,则引用的变量必须具有外部链接。如果包含extern的声明具有块作用域,则引用的变量可能具有外部链接或内部链接,这取决于该变量的定义式声明。
- auto说明符表明变量是自动存储期,只能用于块作用域的变量声明中。由于在块中声明的变量本身就具有自动存储期,所以用auto主要是为了明确表达要使用与外部变量同名的局部变量的意图。
- register说明符也只用于具有块作用域的变量,它把变量归为寄存器存储类别,请求最快速度访问该变量,同时,还保护了该变量地址不被获取。