Spec-Zone.ru › C++

Реализации без хостинга и с хостингом

Стандарт C++ определяет два типа реализаций: с хостингом и без хостинга. Для реализаций с хостингом набор заголовочных файлов стандартной библиотеки, требуемый стандартом C++, значительно больше, чем для реализаций без хостинга. В реализации без хостинга выполнение может происходить без операционной системы.

Тип реализации определяется реализацией. Макрос __STDC_HOSTED__ предопределен как 1 для реализаций с хостингом и как 0 для реализаций без хостинга.(с C++11)

Требования к многопоточным выполнениям и гонкам данных

без хостинга с хостингом
В реализации без хостинга определяется реализацией, может ли программа иметь более одного потока выполнения. В реализации с хостингом программа C++ может иметь более одного потока, выполняющегося параллельно.
(с C++11)

Требования к функции main

без хостинга с хостингом
В реализации без хостинга определяется реализацией, должна ли программа определять функцию main. Инициализация и завершение выполнения определяются реализацией; инициализация включает выполнение конструкторов объектов области видимости глобального пространства имён со статической продолжительностью хранения; завершение включает выполнение деструкторов объектов со статической продолжительностью хранения. В реализации с хостингом программа должна содержать глобальную функцию, называемую main. Выполнение программы запускает основной поток выполнения, в котором вызывается функция main, и в котором могут инициализироваться и уничтожаться переменные со статической продолжительностью хранения.

Требования к заголовочным файлам стандартной библиотеки

В реализации без хостинга набор заголовочных файлов определяется реализацией. Этот набор включает по крайней мере заголовочные файлы в следующей таблице.

Для частично реализованных заголовочных файлов реализации без хостинга необходимо предоставить только часть сущностей в соответствующем описании:

  • Если сущность прокомментирована // freestanding, она гарантированно будет предоставлена.
  • Если сущность (функция или шаблон функции) прокомментирована // freestanding-deleted, она гарантированно будет предоставлена или удалена.
(с 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)
Все
  1. Поддержка всегда атомарных целочисленных типов без блокировки и наличие псевдонимов типов 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>, для самостоятельной реализации, хотя эти заголовки могут быть не переносимыми или не предоставлять те же возможности, что и реализация с поддержкой среды. Лучше избегать их использования в среде самостоятельной реализации, даже если компилятор их предоставляет.

END_OF_DOCUMENT_MARKER
Тестирование возможностей макрос Значение Стандарт Функция
__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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API