【笔记】【C++】【基础语法】作用域(scope)、持续时间(duration)和链接(linkage)
最近正在复习+学习C++(查漏补缺ing)。记录一下学习所得。希望能将所学都整理成一系列的笔记和博客。优先记录到自己的笔记中,有空就搬运到博客。
学习参考网站:learncpp 7.1-7.12
这次学习的内容是:作用域、持续时间和链接。这三个概念和变量或标识符(包含变量、类型和函数)有着密切的关系。
1. 作用域(scope)
主要用来指明变量起作用的范围。
作用域主要有两类:块作用域(局部作用域)和文件作用域(全局作用域)
- 块作用域:标识符只在当前所在的块中可见。例如局部变量、函数参数、在块内声明的程序定义的类型定义(例如枚举和类)。
- 文件作用域:标识符在当前所在文件的整个范围内都可见。例如全局变量、函数、在命名空间内或全局范围内声明的程序定义的类型定义(例如枚举和类)
2. 持续时间 (duration)
持续时间(duration)(不知道这个的专业术语叫什么,目前都先叫持续时间。)指的是变量创建到销毁的整个持续时间
持续时间可以分为三类:自动持续时间、静态持续时间和动态持续时间.
- 自动持续时间:变量从声明时创建,到当前块的末尾销毁。例如函数形参,局部变量。
- 静态持续时间:变量从程序开始时创建,一直到程序结束时销毁。例如全局变量、静态局部变量。
- 动态持续时间:变量由程序员决定创建和销毁。例如动态分配的变量。
不同的持续时间也可以表现出不同类型的变量的一个生命周期。
3. 链接(linkage)
链接用于标识当前标识符(变量、类型或函数)是否可以在其他文件中可见。
链接有三种:无链接、内部链接和外部链接。
- 无链接:表明该标识符独一无二,不会被链接使用。例如局部变量、在块内声明的程序定义的类型标识符(例如枚举和类)。
- 内部链接:表明该标识符只会在当前文件中使用,其他文件中无法访问该标识符。例如静态全局变量(已初始化或未初始化)、静态函数、全局变量、未命名的命名空间及其中定义的任何内容。
- 外部链接:表明该标识符会在其他文件中使用。例如非静态函数、非常量全局变量(已初始化或未初始化)、全局变量、内联 const 全局变量、命名空间。
4. 总结
类型 | 例子 | 作用域 | 持续时间 | 链接 | 笔记 |
---|---|---|---|---|---|
局部变量 | int x; | 块作用域 | 自动持续时间 | 无链接 | |
静态局部变量 | static int s_x; | 块作用域 | 静态持续时间 | 无链接 | |
动态局部变量 | int* x { new int{} }; | 块作用域 | 动态持续时间 | 无链接 | |
函数参数 | void foo(int x); | 块作用域 | 自动持续时间 | 无链接 | |
内部 non-const 全局变量 | static int g_x; | 文件作用域 | 静态持续时间 | 内部链接 | 可以已初始化或未初始化 |
外部 non-const 全局变量 | int g_x; | 文件作用域 | 静态持续时间 | 外部链接 | 可以已初始化或未初始化 |
内联 non-const 全局变量 (C++17) | inline int g_x; | 文件作用域 | 静态持续时间 | 外部链接 | 可以已初始化或未初始化 |
内部常量全局变量 | constexpr int g_x { 1 }; | 文件作用域 | 静态持续时间 | 内部链接 | 必须初始化 |
外部常量全局变量 | extern const int g_x { 1 }; | 文件作用域 | 静态持续时间 | 外部链接 | 必须初始化 |
内联常量全局变量 (C++17) | inline constexpr int g_x { 1 }; | 文件作用域 | 静态持续时间 | 外部链接 | 必须初始化 |