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 ClassDurationScopeLinkageHow Declared
automaticAutomaticBlockNoneIn a block
registerAutomaticBlockNoneIn a block with the keyword register
static with external linkageStaticFileexternalOutside of all functions
statice with internal linkageStaticFileInternalOutside of all functions with the keyword static
static with no linkageStaticBlockNoneIn a block with the keyword static

转载于:https://www.cnblogs.com/jeffrey-yang/p/10261537.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值