独立与宿主实现
来自cppreference.com
< cpp
C++ 标准定义了两种实现:宿主(hosted)与独立(freestanding)实现。C++ 标准对宿主 实现所规定的标准库标头集合比对独立 实现所规定的大很多。独立 实现中程序可能在没有操作系统的情况下运行。
实现的种类由实现定义。宏 __STDC_HOSTED__
对宿主实现预定义为 1
,对独立实现为 0
。 (C++11 起)
针对多线程执行与数据竞争的规定
|
(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> | 全部 | |
概念 | <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 起) | 部分 |
并发支持 | 原子操作 | <atomic> (C++11 起) | 全部[1] |
弃用的标头 | <ciso646> (C++20 前) <cstdalign> (C++11 起)(C++20 前) <cstdbool> (C++11 起)(C++20 前) |
全部 |
- ↑ 始终免锁的整数原子类型的支持,以及类型别名 std::atomic_signed_lock_free 与 std::atomic_unsigned_lock_free 的存在性在自立实现由实现定义。 (C++20 起)
注解
需要注意的是,一些编译器供应商可能无法完全支持独立实现,例如 GCC libstdc++ 在 GCC 13 之前存在实现和构建问题,而 LLVM libcxx 和 MSVC STL 完全不支持独立实现。
在 C++23 中,许多功能计划将有些标头部分独立。但是,wg21 仍在讨论是否在未来标准中(或许C++26)将其他例如 <array> 等标头制定为独立实现。无论如何,像 vector、list、deque 和 map 这样的容器永远不会独立,因为它们的实现依赖异常和堆。
GCC 13 为独立实现提供了更多标头,例如 optional、span、array 和 bitset。但是,需要注意的是,在独立环境中使用这些标头可能无法移植,并且可能无法提供与宿主实现相同的体验。因此,即使工具链提供了这些标头,最好也不要在独立环境中使用它们。
功能特性测试宏 | 值 | 标准 | 注释 |
---|---|---|---|
__cpp_lib_freestanding_feature_test_macros |
202306L | (C++26) | 独立的功能特性测试宏 |
__cpp_lib_freestanding_char_traits |
202306L | (C++26) | 独立的 std::char_traits |
__cpp_lib_freestanding_errc |
202306L | (C++26) | 独立的 std::errc |
__cpp_lib_freestanding_charconv |
202306L | (C++26) | 独立的 <charconv> |
__cpp_lib_freestanding_cstdlib |
202306L | (C++26) | 独立的 <cstdlib> |
__cpp_lib_freestanding_cstring |
202306L | (C++26) | 独立的 <cstring> |
__cpp_lib_freestanding_cwchar |
202306L | (C++26) | 独立的 <cwchar> |
__cpp_lib_freestanding_functional |
202306L | (C++26) | 独立的 <functional> |
__cpp_lib_freestanding_iterator |
202306L | (C++26) | 独立的 <iterator> |
__cpp_lib_freestanding_memory |
202306L | (C++26) | 独立的 <memory> |
__cpp_lib_freestanding_ranges |
202306L | (C++26) | 独立的 <ranges> |
__cpp_lib_freestanding_ratio |
202306L | (C++26) | 独立的 <ratio> |
__cpp_lib_freestanding_tuple |
202306L | (C++26) | 独立的 <tuple> |
__cpp_lib_freestanding_utility |
202306L | (C++26) | 独立的 <utility> |
引用
- C++23 标准(ISO/IEC 14882:2023):
- 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 1938 | C++98 | 实现的文档不需要指明它是否有宿主 | 实现种类由实现定义(这样文档就需要指明) |
LWG 3653 (P1642R11) |
C++20 | <coroutine> 是独立的, 但它使用的 std::hash 不是 |
<functional> 部分独立 |