命名空間
變體
動作

獨立式與宿主式實作

出自 cppreference.com
< cpp

C++ 標準定義了兩種實作方式:宿主式 (hosted)獨立式 (freestanding) 實作。對於「宿主式」實作,C++ 標準所要求的標準函式庫標頭檔集合遠大於「獨立式」實作。在「獨立式」實作中,程式執行時可能不需要作業系統。

實作的類型由實作定義。 對於宿主式實作,巨集 __STDC_HOSTED__ 預定義為 1;對於獨立式實作,則預定義為 0(C++11 起)

目錄

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

獨立式 宿主式
獨立式 實作下,程式是否能擁有超過一個 執行執行緒 (thread of execution) 由實作定義。 宿主式 實作下,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 起) 部分
元編程 (Metaprogramming) 型別特徵 <type_traits> (C++11 起) 全部
編譯期有理數運算  <ratio> (C++23 起) 全部
通用公用程式 工具元件 <utility> (C++23 起) 全部
元組 (Tuples) <tuple> (C++23 起) 全部
函式物件 <functional> (C++20 起) 部分
基礎數值轉換 <charconv> (C++26 起) 部分
位元操作 <bit> (C++20 起) 全部
字串 字串類別 <string> (C++26 起) 部分
空終止
序列工具
<cstring> (C++26 起)
<cwchar> (C++26 起)
部分
迭代器 <iterator> (C++23 起) 部分
範圍 (Ranges) <ranges> (C++23 起) 部分
數值 數學函式
針對浮點類型
<cmath> (C++26 起) 部分
並行支援 (Concurrency support) 原子 (Atomics) <atomic> (C++11 起)     全部[1]
已棄用標頭檔 <ciso646> (直到 C++20)
<cstdalign> (C++11 起)(C++20 前) 
<cstdbool> (C++11 起)(C++20 前)
全部
  1. 在獨立式實作中,是否支援「永遠無鎖 (always lock-free)」的整數原子類型,以及是否存在類型別名 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 實作合規性 [intro.compliance] (p: 10)
  • 6.9.2 多執行緒執行與資料競爭 [intro.multithread] (p: 84)
  • 6.9.3.1 main 函式 [basic.start.main] (p: 89)
  • 16.4.2.5 獨立式實作 [compliance] (p: 483)
  • C++20 標準 (ISO/IEC 14882:2020)
  • 4.1 實作合規性 [intro.compliance] (p: 7)
  • 6.9.2 多執行緒執行與資料競爭 [intro.multithread] (p: 77)
  • 6.9.3.1 main 函式 [basic.start.main] (p: 82)
  • 16.5.1.3 獨立式實作 [compliance] (p: 470)
  • C++17 標準 (ISO/IEC 14882:2017)
  • 4.1 實作合規性 [intro.compliance] (p: 5)
  • 4.7 多執行緒執行與資料競爭 [intro.multithread] (p: 15)
  • 6.6.1 main 函式 [basic.start.main] (p: 66)
  • 20.5.1.3 獨立式實作 [compliance] (p: 458)
  • C++14 標準 (ISO/IEC 14882:2014)
  • 1.4 實作合規性 [intro.compliance] (p: 5)
  • 1.10 多執行緒執行與資料競爭 [intro.multithread] (p: 11)
  • 3.6.1 main 函式 [basic.start.main] (p: 62)
  • 17.6.1.3 獨立式實作 [compliance] (p: 441)
  • C++11 標準 (ISO/IEC 14882:2011)
  • 1.4 實作合規性 [intro.compliance] (p: 5)
  • 1.10 多執行緒執行與資料競爭 [intro.multithread] (p: 11)
  • 3.6.1 main 函式 [basic.start.main] (p: 58)
  • 17.6.1.3 獨立式實作 [compliance] (p: 408)
  • C++03 標準 (ISO/IEC 14882:2003)
  • 1.4 實作合規性 [intro.compliance] (p: 3)
  • 3.6.1 main 函式 [basic.start.main] (p: 43)
  • 17.4.1.3 獨立式實作 [lib.compliance] (p: 326)

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。

DR 應用於 出版時的行為 正確的行為
CWG 1938 C++98 實作不需要
記錄其是否為宿主式
將實作類型設為實作
定義(因此需要文件說明)
LWG 3653
(P1642R11)
C++20 <coroutine> 為獨立式,但
使用了 std::hash,該函式並未
被納入 <functional>
的部分獨立式中

[編輯] 參見

C 文件 關於 合規性
English Deutsch 日本語 한국어 中文(简体) 中文(繁體)