Freestanding and hosted implementations
C++标准定义了两类实现: 托管式 实现和 独立式 实现。对于 托管式 实现,C++标准要求的标准库头文件集合远大于 独立式 实现。在 独立式 实现中,程序可在无操作系统环境下运行。
实现类型由实现定义。
预定义宏
__STDC_HOSTED__
在托管实现中展开为
1
,在独立实现中展开为
0
。
(C++11 起)
对 多线程执行与数据竞争 的要求
|
(自 C++11 起) |
关于 main 函数的要求
| 独立式实现 | 托管式实现 |
|---|---|
| 在 独立式实现 中,程序是否需要定义 main 函数由实现定义。启动与终止过程由实现定义:启动过程包含执行具有静态存储期的 命名空间作用域 对象的 构造函数 ;终止过程包含执行具有静态 存储期 对象的 析构函数 。 |
在
托管式实现
中,程序必须包含名为
main
的全局函数。程序执行时会在主
执行线程
中调用
main
函数,并在此线程中初始化和销毁具有静态
存储期
的变量。
|
关于 标准库头文件 的要求
一个 独立 实现具有一组由实现定义的头文件。该集合至少包含下表中的头文件。
对于部分独立头文件,独立实现仅需提供对应概要中的部分实体:
- 若某个实体被注释为 // freestanding ,则保证其会被提供。
|
(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 |
||
- ↑ 始终无锁的整型原子类型支持以及类型别名 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> ,尽管这些头文件可能不具备可移植性或提供与托管实现相同的功能。即使在工具链提供这些头文件的情况下,也最好避免在独立环境中使用它们。
参考文献
- 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
|