CH12 存储类、链接和内存管理
作用域(scope)
-
代码块作用域(block scope): 包含在开始花括号
{
和对应结束花括号}
之内的一段代码。
传统上,具有代码块作用域的变量都必须在代码块的开始处进行声明。C99放宽了这以规则,允许在一个代码块的任何位置声明变量。你一定见过类似这样的代码:
for(int i=0; i<10; i++)
printf("A C99 feature: i = %d\n",i);
在一些古老的IDE或者编译器上,这样的代码可能编译不通过,主要原因可能就是它不支持C99的新特性。
- 文件作用域(file scope): 具有文件作用域的变量从它定义处到包含该定义的文件借书处都是可见的。
-
函数作用域(function scope): 它只适用于
goto
语句使用的标签(label)。函数作用域意味着一个特定函数中的goto
标签对该函数中任何地方的代码都是可见的,无论该标签出现在哪个代码块中。
链接(linkage)
-
外部链接(external linkage): 一个具有外部链接的变量可以在一个多文件程序的任何地方使用。
-
内部链接(internal linkage): 一个具有内部链接的变量可以再一个文件的任何地方使用。
int giants=5; // 文件作用域,外部链接 static int dodgers=3; // 文件作用域,内部链接
-
空连接(no linkage): 具有代码块作用域或者函数原型作用域的变量有空连接,意味着他们是由其定义所在的代码块或者函数原型所私有的。
存储时期(storage duration)
- 静态存储时期(static storage duration): 如果一个变量具有静态存储时期,它在程序执行期间将一直存在。具有文件作用域的变量具有静态存储时期。注意对于具有文件作用域的变量,关键词
static
表明链接类型并非存储时期。 - 自动存储时期(auto storage duration): 具有代码块作用域的变量一般情况下具有自动存储时期。
总结
C使用作用域、链接和存储时期来定义五种存储类:
- 自动
- 寄存器
- 具有代码块作用域的静态
- 具有外部链接的静态
- 具有内部链接的静态
存储类 | 时期 | 作用域 | 链接 | 声明方式 |
---|---|---|---|---|
自动 | 自动 | 代码块 | 空 | 代码块内 |
寄存器 | 自动 | 代码块 | 空 | 代码块内,使用关键字static |
具有外部链接的静态 | 静态 | 文件 | 外部 | 所有函数之外 |
具有内部链接的静态 | 静态 | 文件 | 内部 | 所有函数之外,使用关键字static |
空连接的静态 | 静态 | 代码块 | 空 | 代码块内,使用关键字static |
网友评论