变量的作用域
C语言中变量的作用域(Scope)有以下几种:
- 块作用域(block scope)
- 函数作用域(function scope)
- 函数原型作用域(function prototype scope)
- 文件作用域(file scope)
块作用域
定义在{}内的变量以及函数内部(同样包含‘{}’)的变量通常为块作用域,变量的可见性(visible)从定义处开始,直到块结尾。
函数参数内的变量,虽然在函数‘{’前,也处于块作用域内。
函数作用域
函数作用域仅适用于与goto语句一起使用的标签。这意味着即使标签首次出现在函数的内部块中,其范围也会扩展到整个函数。 如果在两个单独的块中使用相同的标签,那将会令人困惑,标签的功能范围可以防止这种情况发生。
函数原型作用域
一般出现在函数的声明处,函数参数的变量作用域仅在变量定义处开始,函数声明处结尾。意味着编译器仅仅关系函数声明的参数数据类型,而参数名,通常不关心。
文件作用域
在任何函数外定义的变量拥有文件作用域,文件作用域的变量其可见性从定义处开始,直到文件结尾。
Note: 一般说变量具有文件作用域时,其可见性一般整个转换单元(translation unit)(在C和C ++编程语言术语中,转换单元是生成目标文件的C或C ++编译器的最终输入。 在临时使用中,它有时被称为编译单元。 翻译单元大致由C预处理器处理后的源文件组成,这意味着#include指令中列出的头文件是字面上包含的,#ifdef中的代码段可能包含在内,并且宏已经扩展。)。
链接特性
C语言中的变量有以下三种链接特性:
- 外部链接(external linkage)
- 内部链接(internal linkage)
- 无链接(no linkage)
处于块作用域,函数作用域,函数原型作用域的变量“无链接”,意味着这些变量在它们所在的定义处私有。
处于文件作用域的变量为外链接或内链接。一个为外链接的变量能够在多文件程序中的任意地方使用;一个为内链接的变量只能在当个转换单元(translation unit)内的任意地方使用。
Note:在任何函数外定义的变量,如果用标识符"static"标识,则为文件作用域,且为内部链接。默认为文件作用域,外部链接。
int giants = 5; // file scope, external linkage
static int dodgers = 3 // file scope, internal linkage
int main()
{
...
}
变量存储周期
作用域(scope)和链接(linkage)描述了标识符的可见性。 存储周期(storage duration)描述了这些标识符访问的对象的持久性。C语言的对象有以下四种存储周期:
- 静态存储期(static storage duration)
- 线程存储期(thread storage duration)
- 自动存储期(automatic storage duration)
- 分配存储期(allocated storage duration)
若对象拥有静态存储期,则其存在于程序的整个运行周期。拥有文件作用域的变量拥有静态存储期。
线程存储期一般用于并发编程(concurrent programming),程序的执行被划分为多个线程执行。拥有线程存储期的对象存在其声明处,直到线程终止处。一般使用关键字"_Thread_local"。若一般变量使用该标识符,则每个线程都会复制该变量为每个线程私有。
在块作用域中声明的变量一般拥有自动存储期,当程序进入定义该变量所在的块时,这些变量具有为其分配的内存,并且当块退出时释放内存。
总结
Storage Class | Duration | Scope | Linkage | How Declared |
---|---|---|---|---|
automatic | Automatic | Block | None | In a block |
register | Automatic | Block | None | In a block with the keyword register |
static with external linkage | Static | File | external | Outside of all functions |
statice with internal linkage | Static | File | Internal | Outside of all functions with the keyword static |
static with no linkage | Static | Block | None | In a block with the keyword static |
原文地址:https://www.cnblogs.com/jeffrey-yang/p/10261537.html