作用域 存储期
作用域
-
块作用域:在块(花括号括起来的复合语句)中局部变量、函数形参、for、while、do…while、if都是块作用域。选择与循环中,整个选择与循环是其所在块的子块,循环体/分支体是整个循环/选择块的子块。若嵌套块作用域出现了同名变量,则最内层的块作用域会覆盖掉外层块作用域的同名变量,直到程序运行退出内部块作用域。
-
函数作用域:goto语句的标签。一个标签无论在函数体的何处(无论处于多少层块中),其作用域是整个函数
-
函数原形作用域:函数形参名。范围从形参定义到函数声明结束。也就是说,除了VLA,在函数声明时形参名对于编译器无关紧要。
-
文件作用域:全局变量。范围:从其被定义到EOF。每组源代码文件及其所包含的文件都是一个翻译单元。具有文件作用域的变量实际可见范围为整个翻译单元。
链接
链接属性:外部链接、内部链接、无链接
-
块作用域、函数作用域、函数原形作用域都是无链接变量,属于其内部私有
-
文件作用域:
- 外部链接文件作用域变量:在多个翻译单元中能使用的变量,使用存储类别说明符extern。全局作用域一般指代外部链接文件作用域。
- 内部链接文件作用域:只能在一个翻译单元内使用的变量,使用存储类别说明符static。
存储期(生存周期)
- 静态存储期:文件作用域变量
- 线程存储期:多线程并发程序
- 自动存储期:默认情况下的块作用域(局部变量)(默认用auto修饰)
- 动态分配存储期
存储类别
变量存储类别说明符
-
auto(自动)(注:C和C++中的auto不同):在块作用域中未初始化的自动变量会被填充随机值(垃圾数据)。
-
register(寄存器):寄存器变量的register说明符只是一种请求,具体取决于编译器。加上register的变量由于储存在寄存器中,所以没有地址。在C++17中,register已被弃用。
-
extern(外部):变量的定义放在所有函数的外部的变量,所有外部变量均具有静态存储期。
-
static(静态):
-
局部静态变量:是在块作用域的静态变量,具有块作用域、无链接(这2点和自动变量相同),但具有静态存储期。在函数形参中不能使用static。若未初始化静态变量,会被自动初始化为0。
在调试过程中会发现,静态变量的定义被跳过。这是因为静态变量和外部变量在程序载入内存时就执行完毕,而并非运行时执行。
-
外部链接静态变量:具有外部链接的文件作用域、静态存储期,也就是通常说的“全局变量”。在C中,全局变量必须以字面常量进行初始化,以命名常量对全局变量进行初始化在C中是不允许的(C++可以)
C语言规定编译器至少需要识别局部标识符的前63个字符和外部标识符的前31个字符。 -
内部链接静态变量:具有内部链接的文件作用域、静态存储期,也就是常说的“用static修饰的全局变量”。
-
-
_Thread_local(多线程并发程序)
-
typedef(类别重命名)
函数存储类别说明符
- extern(外部):默认都为外部函数
- static(静态/内部)
- inline(内联)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)