独立与宿主实现

来自cppreference.com
< cpp


C++ 标准定义了两种实现:宿主独立实现。C++ 标准对宿主 实现所规定的标准库标头集合比对独立 实现所规定的大很多。独立 实现中程序可能在没有操作系统的情况下运行。

实现的种类由实现定义。预定义宏 __STDC_HOSTED__ 在宿主实现中会展开成 1,在独立实现中会展开成 0(C++11 起)

针对多线程执行与数据竞争的规定

独立宿主
独立 实现下,程序能否拥有多于一个执行线程由实现定义。宿主 实现下,C++ 程序可以拥有同时运行的多于一个线程
(C++11 起)

针对 main 函数的要求

独立宿主
独立 实现中,是否要求程序定义 main 函数是由实现定义的。启动与终止过程是由实现定义的;启动过程中包含执行具有静态存储期命名空间作用域对象的构造函数;终止过程中包含执行具有静态存储期的对象的析构函数宿主 实现中,程序必须包含一个名为 main 的全局函数。程序执行时启动一个主执行线程,在其中调用 main 函数,并且具有静态存储期的变量将在其中被初始化和销毁。

针对标准库标头的规定

独立 实现拥有由实现定义的标头集合。此集合至少包含下表中的标头。

对于部分独立的标头,独立实现只需要提供对应概要中的部分实体:

  • 如果实体备注为 // 独立,那么保证会提供它。
  • 如果实体(函数或函数模板)备注为 // 独立或弃置,那么保证会提供或弃置它。
(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 起)部分
空终止序列工具<cstring> (C++26 起)部分
文本处理空终止序列工具<cwchar> (C++26 起)部分
迭代器<iterator> (C++23 起)部分
范围<ranges> (C++23 起)部分
数值浮点数数学函数<cmath> (C++26 起)部分
随机数生成<random> (C++26 起)部分
并发支持原子操作<atomic> (C++11 起)    全部[1]
执行控制<execution> (C++26 起)部分
弃用的标头<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++ 在 GCC 13 之前存在实现和构建问题,而 LLVM libcxx 和 MSVC STL 完全不支持独立实现。

在 C++23 中,许多功能以部分标头的方式独立。但是,WG21 仍在讨论是否在未来标准中将其他标头制定为独立实现。无论如何,像 vectorlistdequemap 这样的容器永远不会独立,因为它们的实现依赖异常和堆。

GCC 13 为独立实现提供了更多标头,例如 <optional><span><array><bitset>。但是,虽然在独立环境中使用这些标头可能无法移植,并且可能无法提供与宿主实现相同的能力,因而即使工具链提供了这些标头,最好也不要在独立环境中使用它们。

功能特性测试标准功能特性
__cpp_lib_freestanding_feature_test_macros202306L(C++26)独立的功能特性测试宏
__cpp_lib_freestanding_algorithm202311L(C++26)独立的 <algorithm>
202502L(C++26)<algorithm> 中的更多独立设施
__cpp_lib_freestanding_array202311L(C++26)独立的 <array>
__cpp_lib_freestanding_char_traits202306L(C++26)独立的 std::char_traits
__cpp_lib_freestanding_charconv202306L(C++26)独立的 <charconv>
__cpp_lib_freestanding_cstdlib202306L(C++26)独立的 <cstdlib>
__cpp_lib_freestanding_cstring202311L(C++26)独立的 <cstring>
__cpp_lib_freestanding_cwchar202306L(C++26)独立的 <cwchar>
__cpp_lib_freestanding_errc202306L(C++26)独立的 std::errc
__cpp_lib_freestanding_execution202502L(C++26)独立的 <execution>
__cpp_lib_freestanding_expected202311L(C++26)独立的 <expected>
__cpp_lib_freestanding_functional202306L(C++26)独立的 <functional>
__cpp_lib_freestanding_iterator202306L(C++26)独立的 <iterator>
__cpp_lib_freestanding_mdspan202311L(C++26)独立的 <mdspan>
__cpp_lib_freestanding_memory202306L(C++26)独立的 <memory>
202502L(C++26)<memory> 中的更多独立设施
__cpp_lib_freestanding_numeric202311L(C++26)独立的 <numeric>
202502L(C++26)<numeric> 中的更多独立设施
__cpp_lib_freestanding_optional202311L(C++26)独立的 <optional>
__cpp_lib_freestanding_random202502L(C++26)独立的 <random>
__cpp_lib_freestanding_ranges202306L(C++26)独立的 <ranges>
__cpp_lib_freestanding_ratio202306L(C++26)独立的 <ratio>
__cpp_lib_freestanding_string_view202311L(C++26)独立的 <string_view>
__cpp_lib_freestanding_tuple202306L(C++26)独立的 <tuple>
__cpp_lib_freestanding_utility202306L(C++26)独立的 <utility>
__cpp_lib_freestanding_variant202311L(C++26)独立的 <variant>

引用

  • C++23 标准(ISO/IEC 14882:2024):
  • 4.1 Implementation compliance [intro.compliance](第 10 页)
  • 6.9.2 Multi-threaded executions and data races [intro.multithread](第 84 页)
  • 6.9.3.1 main function [basic.start.main](第 89 页)
  • 16.4.2.5 Freestanding implementations [compliance](第 483 页)
  • C++20 标准(ISO/IEC 14882:2020):
  • 4.1 Implementation compliance [intro.compliance](第 7 页)
  • 6.9.2 Multi-threaded executions and data races [intro.multithread](第 77 页)
  • 6.9.3.1 main function [basic.start.main](第 82 页)
  • 16.5.1.3 Freestanding implementations [compliance](第 470 页)
  • C++17 标准(ISO/IEC 14882:2017):
  • 4.1 Implementation compliance [intro.compliance](第 5 页)
  • 4.7 Multi-threaded executions and data races [intro.multithread](第 15 页)
  • 6.6.1 main function [basic.start.main](第 66 页)
  • 20.5.1.3 Freestanding implementations [compliance](第 458 页)
  • C++14 标准(ISO/IEC 14882:2014):
  • 1.4 Implementation compliance [intro.compliance](第 5 页)
  • 1.10 Multi-threaded executions and data races [intro.multithread](第 11 页)
  • 3.6.1 Main function [basic.start.main](第 62 页)
  • 17.6.1.3 Freestanding implementations [compliance](第 441 页)
  • C++11 标准(ISO/IEC 14882:2011):
  • 1.4 Implementation compliance [intro.compliance](第 5 页)
  • 1.10 Multi-threaded executions and data races [intro.multithread](第 11 页)
  • 3.6.1 Main function [basic.start.main](第 58 页)
  • 17.6.1.3 Freestanding implementations [compliance](第 408 页)
  • C++03 标准(ISO/IEC 14882:2003):
  • 1.4 Implementation compliance [intro.compliance](第 3 页)
  • 3.6.1 Main function [basic.start.main](第 43 页)
  • 17.4.1.3 Freestanding implementations [lib.compliance](第 326 页)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告应用于出版时的行为正确行为
CWG 1938C++98实现的文档不需要指明它是否有宿主实现种类由实现定义(这样文档就需要指明)
LWG 3653
(P1642R11)
C++20<coroutine> 是独立的,
但它使用的 std::hash 不是
<functional> 部分独立

参阅

遵从性C 文档