C变量作用域,生存期,链接特性

Posted jeffrey-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C变量作用域,生存期,链接特性相关的知识,希望对你有一定的参考价值。

变量的作用域

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




以上是关于C变量作用域,生存期,链接特性的主要内容,如果未能解决你的问题,请参考以下文章

C语言变量的作用域和生存期问题

在c语言中 分别从变量的作用域和生存期来分析变量各都有哪些种类

C 内存管理初步了解

8——对象的作用域,生存期,……

php变量的作用域和生存期

C语言中,哪种存储类的作用域与生命周期是不一致的?