Namespaces
Variants

Freestanding and hosted implementations

From cppreference.net

C++标准定义了两类实现: 托管式 实现和 独立式 实现。对于 托管式 实现,C++标准要求的标准库头文件集合远大于 独立式 实现。在 独立式 实现中,程序可在无操作系统环境下运行。

实现类型由实现定义。 预定义宏 __STDC_HOSTED__ 在托管实现中展开为 1 ,在独立实现中展开为 0 (C++11 起)

目录

多线程执行与数据竞争 的要求

独立实现 托管实现
独立实现 下,程序是否能拥有多个 执行线程 由实现定义。 托管实现 下,C++程序可以拥有多个并发运行的 线程
(自 C++11 起)

关于 main 函数的要求

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

关于 标准库头文件 的要求

一个 独立 实现具有一组由实现定义的头文件。该集合至少包含下表中的头文件。

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

  • 若某个实体被注释为 // freestanding ,则保证其会被提供。
  • 若某实体(函数或函数模板)被标注为 // freestanding-deleted ,则保证其要么被提供要么被删除。
(since C++26)
  • 如果某个实体在头文件中声明,且其概要以 all freestanding // mostly freestanding 开头,则保证会提供该实体(除非该实体本身被注释)。

独立实现所需的头文件

组件 头文件 独立实现
语言支持 通用定义 <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> (since 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 起) <span class="t-mark
  1. 始终无锁的整型原子类型支持以及类型别名 std::atomic_signed_lock_free std::atomic_unsigned_lock_free 的存在在独立实现中由实现定义。 (since C++20)

注释

某些编译器厂商可能未完全支持独立环境实现。例如,GCC libstdc++ 在13版本之前存在实现和构建问题,而LLVM libcxx 和 MSVC STL 目前均不支持独立环境。

在C++23中,许多特性通过部分头文件实现了独立环境支持。然而,WG21仍在讨论是否在未来标准中将某些头文件纳入独立环境。无论如何,像 vector list deque map 这样的容器永远不会成为独立环境组件,因为它们依赖于异常处理和堆内存机制。

GCC 13 为独立环境提供了更多头文件,例如 <optional> <span> <array> <bitset> ,尽管这些头文件可能不具备可移植性或提供与托管实现相同的功能。即使在工具链提供这些头文件的情况下,也最好避免在独立环境中使用它们。

特性测试 标准 特性
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) 独立环境特性测试宏
__cpp_lib_freestanding_algorithm 202311L (C++26) 独立环境 <algorithm>
202502L (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_execution 202502L (C++26) 独立环境 <execution>
__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>
202502L (C++26) <memory> 中的更多独立环境设施
__cpp_lib_freestanding_numeric 202311L (C++26) 独立环境 <numeric>
202502L (C++26) <numeric> 中的更多独立环境设施
__cpp_lib_freestanding_optional 202311L (C++26) 独立环境 <optional>
__cpp_lib_freestanding_random 202502L (C++26) 独立环境 <random>
__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++23 标准 (ISO/IEC 14882:2024):
  • 4.1 实现符合性 [intro.compliance] (页码: 10)
  • 6.9.2 多线程执行与数据竞争 [intro.multithread] (页码: 84)
  • 6.9.3.1 main 函数 [basic.start.main] (页码: 89)
  • 16.4.2.5 独立实现 [compliance] (页码: 483)
  • C++20 标准 (ISO/IEC 14882:2020):
  • 4.1 实现符合性 [intro.compliance] (页码: 7)
  • 6.9.2 多线程执行与数据竞争 [intro.multithread] (页码: 77)
  • 6.9.3.1 main 函数 [basic.start.main] (页码: 82)
  • 16.5.1.3 独立实现 [compliance] (页码: 470)
  • C++17 标准 (ISO/IEC 14882:2017):
  • 4.1 实现符合性 [intro.compliance] (页码: 5)
  • 4.7 多线程执行与数据竞争 [intro.multithread] (页码: 15)
  • 6.6.1 main 函数 [basic.start.main] (页码: 66)
  • 20.5.1.3 独立实现 [compliance] (页码: 458)
  • C++14 标准 (ISO/IEC 14882:2014):
  • 1.4 实现符合性 [intro.compliance] (页码: 5)
  • 1.10 多线程执行与数据竞争 [intro.multithread] (页码: 11)
  • 3.6.1 主函数 [basic.start.main] (页码: 62)
  • 17.6.1.3 独立实现 [compliance] (页码: 441)
  • C++11 标准 (ISO/IEC 14882:2011):
  • 1.4 实现符合性 [intro.compliance] (页码: 5)
  • 1.10 多线程执行与数据竞争 [intro.multithread] (页码: 11)
  • 3.6.1 主函数 [basic.start.main] (页码: 58)
  • 17.6.1.3 独立实现 [compliance] (页码: 408)
  • C++03 标准 (ISO/IEC 14882:2003):
  • 1.4 实现符合性 [intro.compliance] (页: 3)
  • 3.6.1 主函数 [basic.start.main] (页: 43)
  • 17.4.1.3 独立实现 [lib.compliance] (页: 326)

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 适用范围 发布时行为 正确行为
CWG 1938 C++98 实现无需说明其是否为托管实现 将实现类型设为由实现定义(因此需要文档说明)
LWG 3653
( P1642R11 )
C++20 <coroutine> 是独立实现,但
使用了非独立实现的 std::hash
使 <functional> 成为
部分独立实现

参见

C 文档 关于 Conformance