名稱空間
變體
操作

獨立式和宿主式實現

來自 cppreference.com
< cpp

C++ 標準定義了兩種實現:**宿主式**實現和**獨立式**實現。對於宿主式實現,C++ 標準要求的標準庫標頭檔案集合比獨立式實現大得多。在獨立式實現中,程式可以在沒有作業系統的環境下執行。

實現的型別是實現定義的。宏 `__STDC_HOSTED__` 對於宿主式實現預定義為 `1`,對於獨立式實現預定義為 `0`。(C++11 起)

目錄

多執行緒執行和資料競爭的要求

獨立式 宿主式
在*獨立式*實現下,程式是否可以有多個執行執行緒是實現定義的。 在*宿主式*實現下,C++ 程式可以有多個執行緒併發執行。
(C++11 起)

[編輯] 關於 main 函式的要求

獨立式 宿主式
在*獨立式*實現中,程式是否需要定義 main 函式是實現定義的。啟動和終止是實現定義的;啟動包括具有靜態儲存期的名稱空間作用域物件的建構函式的執行;終止包括具有靜態儲存期物件的解構函式的執行。 在*宿主式*實現中,程式必須包含一個名為 main 的全域性函式。執行程式會啟動一個主執行執行緒,在該執行緒中呼叫 `main` 函式,並且在該執行緒中可以初始化和銷燬具有靜態儲存期的變數。

[編輯] 關於標準庫標頭檔案的要求

獨立式實現具有一組實現定義的標頭檔案。此集合至少包含下表中的標頭檔案。

對於部分獨立式標頭檔案,獨立式實現只需提供對應概要中的部分實體。

  • 如果一個實體被註釋為 // freestanding,則保證會提供。
  • 如果一個實體(函式或函式模板)被註釋為 // freestanding-deleted,則保證會提供或刪除。
(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)
全部
  1. 在獨立式實現中,對始終無鎖的整型原子型別的支援以及類型別名 std::atomic_signed_lock_freestd::atomic_unsigned_lock_free 的存在是實現定義的。(C++20 起)

[編輯] 注意

一些編譯器供應商可能不完全支援獨立式實現。例如,GCC libstdc++ 在版本 13 之前存在實現和構建問題,而 LLVM libcxx 和 MSVC STL 不支援獨立式。

在 C++23 中,許多功能透過部分標頭檔案成為獨立式。然而,WG21 仍在討論未來標準中是否會將一些標頭檔案設定為獨立式。無論如何,像 vectorlistdequemap 這樣的容器永遠不會是獨立式的,因為它們依賴於異常和堆。

GCC 13 為獨立式提供了更多標頭檔案,例如 <optional><span><array><bitset>,儘管這些標頭檔案可能不具有可移植性,或者不能提供與宿主式實現相同的功能。最好避免在獨立式環境中使用它們,即使工具鏈提供了它們。

特性測試 標準 特性
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) 獨立式特性測試宏
__cpp_lib_freestanding_algorithm 202311L (C++26) 獨立式 <algorithm>
__cpp_lib_freestanding_array 202311L (C++26) 獨立式 <array>
__cpp_lib_freestanding_char_traits 202306L (C++26) 獨立式 std::char_traits
__cpp_lib_freestanding_charconv 202306L (C++26) 獨立式 <charconv>
__cpp_lib_freestanding_cstdlib 202306L (C++26) 獨立式 <cstdlib>
__cpp_lib_freestanding_cstring 202311L (C++26) 獨立式 <cstring>
__cpp_lib_freestanding_cwchar 202306L (C++26) 獨立式 <cwchar>
__cpp_lib_freestanding_errc 202306L (C++26) 獨立式 std::errc
__cpp_lib_freestanding_expected 202311L (C++26) 獨立式 <expected>
__cpp_lib_freestanding_functional 202306L (C++26) 獨立式 <functional>
__cpp_lib_freestanding_iterator 202306L (C++26) 獨立式 <iterator>
__cpp_lib_freestanding_mdspan 202311L (C++26) 獨立式 <mdspan>
__cpp_lib_freestanding_memory 202306L (C++26) 獨立式 <memory>
__cpp_lib_freestanding_numeric 202311L (C++26) 獨立式 <numeric>
__cpp_lib_freestanding_optional 202311L (C++26) 獨立式 <optional>
__cpp_lib_freestanding_ranges 202306L (C++26) 獨立式 <ranges>
__cpp_lib_freestanding_ratio 202306L (C++26) 獨立式 <ratio>
__cpp_lib_freestanding_string_view 202311L (C++26) 獨立式 <string_view>
__cpp_lib_freestanding_tuple 202306L (C++26) 獨立式 <tuple>
__cpp_lib_freestanding_utility 202306L (C++26) 獨立式 <utility>
__cpp_lib_freestanding_variant 202311L (C++26) 獨立式 <variant>

[編輯] 參考文獻

  • 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 文件 關於 符合性