【筆記】【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 }; | 文件作用域 | 靜態持續時間 | 外部鏈接 | 必須初始化 |