Реализации без хостинга и с хостингом
Стандарт C++ определяет два типа реализаций: с хостингом и без хостинга. Для реализаций с хостингом набор заголовочных файлов стандартной библиотеки, требуемый стандартом C++, значительно больше, чем для реализаций без хостинга. В реализации без хостинга выполнение может происходить без операционной системы.
Тип реализации определяется реализацией. Макрос __STDC_HOSTED__ предопределен как 1 для реализаций с хостингом и как 0 для реализаций без хостинга.(с C++11)
Требования к многопоточным выполнениям и гонкам данных
| (с C++11) |
Требования к функции main
| без хостинга | с хостингом |
|---|---|
В реализации без хостинга определяется реализацией, должна ли программа определять функцию main. Инициализация и завершение выполнения определяются реализацией; инициализация включает выполнение конструкторов объектов области видимости глобального пространства имён со статической продолжительностью хранения; завершение включает выполнение деструкторов объектов со статической продолжительностью хранения. | В реализации с хостингом программа должна содержать глобальную функцию, называемую main. Выполнение программы запускает основной поток выполнения, в котором вызывается функция main, и в котором могут инициализироваться и уничтожаться переменные со статической продолжительностью хранения. |
Требования к заголовочным файлам стандартной библиотеки
В реализации без хостинга набор заголовочных файлов определяется реализацией. Этот набор включает по крайней мере заголовочные файлы в следующей таблице.
Для частично реализованных заголовочных файлов реализации без хостинга необходимо предоставить только часть сущностей в соответствующем описании:
- Если сущность прокомментирована // freestanding, она гарантированно будет предоставлена.
| (с 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) | Частично |
| Поддержка параллельности | Атомарные переменные |
<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++ были проблемы с реализацией и сборкой до версии 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> |
__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:2023):
- 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 Функция main [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 Функция main [basic.start.main] (с. 58)
- 17.6.1.3 Автономные реализации [compliance] (с. 408)
- Стандарт C++03 (ISO/IEC 14882:2003):
- 1.4 Соответствие реализации [intro.compliance] (с. 3)
- 3.6.1 Функция main [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 документация для Соответствия |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/freestanding