獨立式和宿主式實現
來自 cppreference.com
< cpp
C++ 標準定義了兩種實現:**宿主式**實現和**獨立式**實現。對於宿主式實現,C++ 標準要求的標準庫標頭檔案集合比獨立式實現大得多。在獨立式實現中,程式可以在沒有作業系統的環境下執行。
實現的型別是實現定義的。宏 `__STDC_HOSTED__` 對於宿主式實現預定義為 `1`,對於獨立式實現預定義為 `0`。(C++11 起)
多執行緒執行和資料競爭的要求
|
(C++11 起) |
[編輯] 關於 main 函式的要求
獨立式 | 宿主式 |
---|---|
在*獨立式*實現中,程式是否需要定義 main 函式是實現定義的。啟動和終止是實現定義的;啟動包括具有靜態儲存期的名稱空間作用域物件的建構函式的執行;終止包括具有靜態儲存期物件的解構函式的執行。 | 在*宿主式*實現中,程式必須包含一個名為 main 的全域性函式。執行程式會啟動一個主執行執行緒,在該執行緒中呼叫 `main` 函式,並且在該執行緒中可以初始化和銷燬具有靜態儲存期的變數。 |
[編輯] 關於標準庫標頭檔案的要求
獨立式實現具有一組實現定義的標頭檔案。此集合至少包含下表中的標頭檔案。
對於部分獨立式標頭檔案,獨立式實現只需提供對應概要中的部分實體。
- 如果一個實體被註釋為 // freestanding,則保證會提供。
|
(C++26 起) |
庫 | 元件 | 標頭檔案 | 獨立式 |
---|---|---|---|
語言支援 | 通用定義 | <cstddef> | 全部 |
C 標準庫 | <cstdlib> | 部分 | |
實現屬性 | <cfloat> <climits> (C++11 起) <limits> <version> (C++20 起) |
全部 | |
整數型別 | <cstdint> (C++11 起) | 全部 | |
動態記憶體管理 | <new> | 全部 | |
型別識別 | <typeinfo> | 全部 | |
源位置 | <source_location> (C++20 起) | 全部 | |
異常處理 | <exception> | 全部 | |
初始化器列表 | <initializer_list> (C++11 起) | 全部 | |
比較 | <compare> (C++20 起) | 全部 | |
協程支援 | <coroutine> (C++20 起) | 全部 | |
其他執行時支援 | <cstdarg> | 全部 | |
除錯支援 | <debugging> (C++26 起) | 全部 | |
概念 | <concepts> (C++20 起) | 全部 | |
診斷 | 錯誤號 | <cerrno> (C++26 起) | 部分 |
系統錯誤支援 | <system_error> (C++26 起) | 部分 | |
記憶體管理 | 記憶體 | <memory> (C++23 起) | 部分 |
超程式設計 | 型別特性 | <type_traits> (C++11 起) | 全部 |
編譯時有理算術 | <ratio> (C++23 起) | 全部 | |
通用工具 | 實用元件 | <utility> (C++23 起) | 全部 |
元組 | <tuple> (C++23 起) | 全部 | |
函式物件 | <functional> (C++20 起) | 部分 | |
原生數值轉換 | <charconv> (C++26 起) | 部分 | |
位操作 | <bit> (C++20 起) | 全部 | |
字串 | 字串類 | <string> (C++26 起) | 部分 |
以 null 結尾的 序列工具 |
<cstring> (C++26 起) <cwchar> (C++26 起) |
部分 | |
迭代器 | <iterator> (C++23 起) | 部分 | |
範圍 | <ranges> (C++23 起) | 部分 | |
數值 | 浮點型別 的數學函式 |
<cmath> (C++26 起) | 部分 |
併發支援 | 原子操作 | <atomic> (C++11 起) | 全部[1] |
**已廢棄**標頭檔案 | <ciso646> (直至 C++20) <cstdalign> (C++11 起)(直至 C++20) <cstdbool> (C++11 起)(直至 C++20) |
全部 |
- ↑ 在獨立式實現中,對始終無鎖的整型原子型別的支援以及類型別名 std::atomic_signed_lock_free 和 std::atomic_unsigned_lock_free 的存在是實現定義的。(C++20 起)
[編輯] 注意
一些編譯器供應商可能不完全支援獨立式實現。例如,GCC libstdc++ 在版本 13 之前存在實現和構建問題,而 LLVM libcxx 和 MSVC STL 不支援獨立式。
在 C++23 中,許多功能透過部分標頭檔案成為獨立式。然而,WG21 仍在討論未來標準中是否會將一些標頭檔案設定為獨立式。無論如何,像 vector、list、deque 和 map 這樣的容器永遠不會是獨立式的,因為它們依賴於異常和堆。
GCC 13 為獨立式提供了更多標頭檔案,例如 <optional>、<span>、<array> 和 <bitset>,儘管這些標頭檔案可能不具有可移植性,或者不能提供與宿主式實現相同的功能。最好避免在獨立式環境中使用它們,即使工具鏈提供了它們。
[編輯] 參考文獻
- C++23 標準 (ISO/IEC 14882:2024)
- 4.1 Implementation compliance [intro.compliance] (p: 10)
- 6.9.2 Multi-threaded executions and data races [intro.multithread] (p: 84)
- 6.9.3.1 main function [basic.start.main] (p: 89)
- 16.4.2.5 Freestanding implementations [compliance] (p: 483)
- C++20 標準 (ISO/IEC 14882:2020)
- 4.1 Implementation compliance [intro.compliance] (p: 7)
- 6.9.2 Multi-threaded executions and data races [intro.multithread] (p: 77)
- 6.9.3.1 main function [basic.start.main] (p: 82)
- 16.5.1.3 Freestanding implementations [compliance] (p: 470)
- C++17 標準 (ISO/IEC 14882:2017)
- 4.1 Implementation compliance [intro.compliance] (p: 5)
- 4.7 Multi-threaded executions and data races [intro.multithread] (p: 15)
- 6.6.1 main function [basic.start.main] (p: 66)
- 20.5.1.3 Freestanding implementations [compliance] (p: 458)
- C++14 標準 (ISO/IEC 14882:2014)
- 1.4 Implementation compliance [intro.compliance] (p: 5)
- 1.10 Multi-threaded executions and data races [intro.multithread] (p: 11)
- 3.6.1 Main function [basic.start.main] (p: 62)
- 17.6.1.3 Freestanding implementations [compliance] (p: 441)
- C++11 標準 (ISO/IEC 14882:2011)
- 1.4 Implementation compliance [intro.compliance] (p: 5)
- 1.10 Multi-threaded executions and data races [intro.multithread] (p: 11)
- 3.6.1 Main function [basic.start.main] (p: 58)
- 17.6.1.3 Freestanding implementations [compliance] (p: 408)
- C++03 標準 (ISO/IEC 14882:2003)
- 1.4 Implementation compliance [intro.compliance] (p: 3)
- 3.6.1 Main function [basic.start.main] (p: 43)
- 17.4.1.3 Freestanding implementations [lib.compliance] (p: 326)
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
CWG 1938 | C++98 | 實現不需要 文件說明它是否是宿主式 |
將實現型別設為實現定義的 (因此需要文件) |
LWG 3653 (P1642R11) |
C++20 | <coroutine> 是獨立式,但 使用了 std::hash,而它未 |
使 <functional> 成為 部分獨立式 |
[編輯] 另請參閱
C 文件 關於 符合性
|