前言
5种存储类别

存储类别说明符
- auto extern static register
内容
- 作用域
- 链接
- 存储期
存储类别可以是变量,还可以是函数
说明
作用域(变量的使用范围)
程序中可访问标识符的区域
- 块作用域
{}内的
1 | { |
没有{}的块
for while if
- 文件作用域
声明在块以外的区域
1 | (static)int x; |
(又分为外部链接,和内部链接。区分它们看有没有static)
- 函数作用域
- 函数原型作用域
int function(int x, int y);仅在此时有用
链接(访问范围)
- 外部链接
可以在不同文件中访问他(但访问时要加上extern) - 内部链接
可以在一个翻译单元内访问编译器源代码文件和所有的头文件都看成一个包含信息的单独文件,而这个文件就是翻译单元。
每个翻译单元均对应一个源代码文件和它所包含的文件。 - 无链接
具有块作用域,函数作用域,函数原型作用域的变量都是无链接变量
存储期(使用时间)
- 静态存储期
在程序执行期间一直存在 - 动态存储期
可以主动控制 - 自动存储期(局部变量)
在块中,从进入块而产生,从退出块而结束
示例
- 文件作用域,外部链接,静态存储期
file_1.c
1 | int x = 1; //声明定义 |
file_2.cextern int x; //引用定义
- 文件作用域,内部链接,静态存储期
1 | static int x; |
- 块作用域,无链接,静态存储期
1 | { |
- 块作用域,无链接,自由存储期
1 | { |
- 寄存器变量(与字典变量属性相同)
{
register int x; //特点快速
}
- 函数的存储类别也和变量类似
int function(int); //默认声明为外部函数
extern int function(int); //引用声明使用外部函数
static int function(int); //声明为内部函数
补充
自动存储期的变量
在进入块中分配内存,
如果不初始化,则是垃圾值静态存储期的变量
在开始程序时分配内存,到程序结束,
如果不初始化,则为0静态存储期变量只能被常量赋值
1 |
|
