Namespaces
Variants

Freestanding and hosted implementations

From cppreference.net

Der C++-Standard definiert zwei Arten von Implementierungen: hosted und freestanding Implementierungen. Bei hosted Implementierungen ist der Satz an Standardbibliothek-Headern, die der C++-Standard vorschreibt, deutlich größer als bei freestanding Implementierungen. In einer freestanding Implementierung kann die Ausführung ohne Betriebssystem erfolgen.

Die Art der Implementierung ist implementierungsdefiniert. Das vordefinierte Makro __STDC_HOSTED__ wird für Hosted-Implementierungen zu 1 expandiert und für Freestanding-Implementierungen zu 0 expandiert. (seit C++11)

Inhaltsverzeichnis

Anforderungen an Multithread-Ausführungen und Datenrennen

freestanding hosted
Unter einer freistehenden Implementierung ist implementierungsdefiniert, ob ein Programm mehr als einen Ausführungsstrang haben kann. Unter einer gehosteten Implementierung kann ein C++-Programm mehr als einen Thread haben, der gleichzeitig läuft.
(seit C++11)

Anforderungen an die main Funktion

freestanding hosted
In einer freestanding Implementierung ist implementierungsdefiniert, ob ein Programm eine main Funktion definieren muss. Start und Beendigung sind implementierungsdefiniert; der Start umfasst die Ausführung von Konstruktoren für Objekte im Namensbereich mit statischer Speicherdauer; die Beendigung umfasst die Ausführung von Destruktoren für Objekte mit statischer Speicherdauer . In einer hosted Implementierung muss ein Programm eine globale Funktion namens main enthalten. Die Ausführung eines Programms startet einen Haupt- Ausführungsstrang , in dem die main Funktion aufgerufen wird und in dem Variablen mit statischer Speicherdauer initialisiert und zerstört werden können.

Anforderungen an Standardbibliothek-Header

Eine freestanding Implementierung hat einen implementierungsdefinierten Satz von Headern. Dieser Satz enthält mindestens die Header in der folgenden Tabelle.

Für teilweise eigenständige Header müssen eigenständige Implementierungen nur einen Teil der Entitäten in der entsprechenden Synopsis bereitstellen:

  • Wenn eine Entität als // freestanding kommentiert ist, wird garantiert, dass sie bereitgestellt wird.
  • Wenn eine Entität (Funktion oder Funktionsvorlage) mit // freestanding-deleted kommentiert ist, ist garantiert, dass sie entweder bereitgestellt oder gelöscht wird.
(seit C++26)
  • Wenn eine Entität in einem Header deklariert wird, dessen Synopsis mit all freestanding oder // mostly freestanding beginnt, ist garantiert, dass sie bereitgestellt wird, falls die Entität selbst nicht kommentiert ist.

Für eine freistehende Implementierung erforderliche Header

Bibliothek Komponente Header Freistehend
Sprachunterstützung Allgemeine Definitionen <cstddef> Alle
C-Standardbibliothek <cstdlib> Teilweise
Implementierungseigenschaften <cfloat>
<climits> (since C++11)
<limits>
<version> (since C++20)
Alle
Integer-Typen <cstdint> (since C++11) Alle
Dynamische Speicherverwaltung <new> Alle
Typidentifikation <typeinfo> Alle
Quellort <source_location> (seit C++20) Alle
Exception-Handling <exception> Alle
Initializer-Listen <initializer_list> (seit C++11) Alle
Vergleiche <compare> (since C++20) Alle
Coroutinen-Unterstützung <coroutine> (seit C++20) Alle
Andere Laufzeitunterstützung <cstdarg> Alle
Debugging-Unterstützung <debugging> (since C++26) Alle
Konzepte <concepts> (seit C++20) Alle
Diagnose Fehlernummern <cerrno> (since C++26) Teilweise
Systemfehlerunterstützung <system_error> (seit C++26) Teilweise
Speicherverwaltung Speicher <memory> (since C++23) Teilweise
Metaprogrammierung Typmerkmale <type_traits> (since C++11) Alle
Kompilierzeit-Rationalarithmetik <ratio> (seit C++23) Alle
Allgemeine Hilfsmittel Hilfskomponenten <utility> (since C++23) Alle
Tupel <tuple> (seit C++23) Alle
Funktionsobjekte <functional> (since C++20) Teilweise
Primitive numerische Konvertierungen <charconv> (since C++26) Teilweise
Bitmanipulation <bit> (seit C++20) Alle
Strings String-Klassen <string> (since C++26) Teilweise
Null-terminierte
Zeichenketten-Funktionen
<cstring> (since C++26) Teilweise
Textverarbeitung Nullterminierte
Sequenz-Utilities
<cwchar> (seit C++26) Teilweise
Iteratoren <iterator> (seit C++23) Teilweise
Ranges <ranges> (seit C++23) Teilweise
Numerik Mathematische Funktionen
für Gleitkommatypen
<cmath> (seit C++26) Teilweise
Zufallszahlengenerierung <random> (since C++26) Teilweise
Nebenläufigkeitsunterstützung Atomics <atomic> (since C++11) Alle [1]
Ausführungssteuerung <execution> (seit C++26) Teilweise
Veraltete Header <ciso646> (bis C++20)
<cstdalign> (seit C++11) (bis C++20)
<cstdbool> (seit C++11) (bis C++20)
Alle
  1. Die Unterstützung für immer sperrfreie integrale atomare Typen und das Vorhandensein der Typaliase std::atomic_signed_lock_free und std::atomic_unsigned_lock_free sind in einer freistehenden Implementierung implementierungsdefiniert. (seit C++20)

Hinweise

Einige Compiler-Anbieter unterstützen möglicherweise freestanding Implementierungen nicht vollständig. Beispielsweise hatte GCC libstdc++ vor Version 13 Implementierungs- und Build-Probleme, während LLVM libcxx und MSVC STL freestanding nicht unterstützen.

In C++23 werden viele Funktionen mit partiellen Headern freistehend gemacht. Es wird jedoch in WG21 noch diskutiert, ob einige Header in zukünftigen Standards freistehend gemacht werden. Unabhängig davon werden Container wie vector , list , deque und map aufgrund ihrer Abhängigkeiten von Exceptions und Heap niemals freistehend sein.

GCC 13 stellt mehr Header bereit, wie zum Beispiel <optional> , <span> , <array> , und <bitset> , für freestanding, obwohl diese Header möglicherweise nicht portabel sind oder die gleichen Fähigkeiten wie eine gehostete Implementierung bieten. Es ist besser, sie in einer freestanding Umgebung nicht zu verwenden, selbst wenn die Toolchain sie bereitstellt.

Feature-Test Makro Wert Std Funktion
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) Freestanding-Feature-Test-Makros
__cpp_lib_freestanding_algorithm 202311L (C++26) Freestanding <algorithm>
202502L (C++26) weitere freistehende Einrichtungen in <algorithm>
__cpp_lib_freestanding_array 202311L (C++26) Freestanding <array>
__cpp_lib_freestanding_char_traits 202306L (C++26) Freestanding std::char_traits
__cpp_lib_freestanding_charconv 202306L (C++26) Freestanding <charconv>
__cpp_lib_freestanding_cstdlib 202306L (C++26) Freestanding <cstdlib>
__cpp_lib_freestanding_cstring 202311L (C++26) Freestanding <cstring>
__cpp_lib_freestanding_cwchar 202306L (C++26) Freestanding <cwchar>
__cpp_lib_freestanding_errc 202306L (C++26) Freestanding std::errc
__cpp_lib_freestanding_execution 202502L (C++26) Freestanding <execution>
__cpp_lib_freestanding_expected 202311L (C++26) Freestanding <expected>
__cpp_lib_freestanding_functional 202306L (C++26) Freestanding <functional>
__cpp_lib_freestanding_iterator 202306L (C++26) Freestanding <iterator>
__cpp_lib_freestanding_mdspan 202311L (C++26) Freestanding <mdspan>
__cpp_lib_freestanding_memory 202306L (C++26) Freestanding <memory>
202502L (C++26) weitere freestanding Einrichtungen in <memory>
__cpp_lib_freestanding_numeric 202311L (C++26) Freestanding <numeric>
202502L (C++26) weitere freistehende Einrichtungen in <numeric>
__cpp_lib_freestanding_optional 202311L (C++26) Freestanding <optional>
__cpp_lib_freestanding_random 202502L (C++26) Freestanding <random>
__cpp_lib_freestanding_ranges 202306L (C++26) Freestanding <ranges>
__cpp_lib_freestanding_ratio 202306L (C++26) Freestanding <ratio>
__cpp_lib_freestanding_string_view 202311L (C++26) Freestanding <string_view>
__cpp_lib_freestanding_tuple 202306L (C++26) Freestanding <tuple>
__cpp_lib_freestanding_utility 202306L (C++26) Freestanding <utility>
__cpp_lib_freestanding_variant 202311L (C++26) Freestanding <variant>

Referenzen

  • C++23-Standard (ISO/IEC 14882:2024):
  • 4.1 Implementierungskonformität [intro.compliance] (S: 10)
  • 6.9.2 Multithreaded-Ausführungen und Datenwettläufe [intro.multithread] (S: 84)
  • 6.9.3.1 main-Funktion [basic.start.main] (S: 89)
  • 16.4.2.5 Freistehende Implementierungen [compliance] (S: 483)
  • C++20-Standard (ISO/IEC 14882:2020):
  • 4.1 Implementierungskonformität [intro.compliance] (S: 7)
  • 6.9.2 Multithreaded-Ausführungen und Datenwettläufe [intro.multithread] (S: 77)
  • 6.9.3.1 main-Funktion [basic.start.main] (S: 82)
  • 16.5.1.3 Freistehende Implementierungen [compliance] (S: 470)
  • C++17-Standard (ISO/IEC 14882:2017):
  • 4.1 Implementierungskonformität [intro.compliance] (S: 5)
  • 4.7 Multithreaded-Ausführungen und Datenrennen [intro.multithread] (S: 15)
  • 6.6.1 main-Funktion [basic.start.main] (S: 66)
  • 20.5.1.3 Freistehende Implementierungen [compliance] (S: 458)
  • C++14-Standard (ISO/IEC 14882:2014):
  • 1.4 Implementierungskonformität [intro.compliance] (S: 5)
  • 1.10 Multithreaded-Ausführungen und Datenrennen [intro.multithread] (S: 11)
  • 3.6.1 Main-Funktion [basic.start.main] (S: 62)
  • 17.6.1.3 Freistehende Implementierungen [compliance] (S: 441)
  • C++11-Standard (ISO/IEC 14882:2011):
  • 1.4 Implementierungskonformität [intro.compliance] (S: 5)
  • 1.10 Multithreaded-Ausführungen und Datenrennen [intro.multithread] (S: 11)
  • 3.6.1 Hauptfunktion [basic.start.main] (S: 58)
  • 17.6.1.3 Freistehende Implementierungen [compliance] (S: 408)
  • C++03-Standard (ISO/IEC 14882:2003):
  • 1.4 Implementierungskonformität [intro.compliance] (S: 3)
  • 3.6.1 Main-Funktion [basic.start.main] (S: 43)
  • 17.4.1.3 Freistehende Implementierungen [lib.compliance] (S: 326)

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 1938 C++98 Eine Implementierung musste nicht
dokumentieren, ob sie gehostet ist
Machte die Implementierungsart implementierungs-
definiert (erfordert somit eine Dokumentation)
LWG 3653
( P1642R11 )
C++20 <coroutine> ist freistehend, aber
verwendet std::hash welches nicht freistehend war
Machte <functional> teilweise
freistehend

Siehe auch

C-Dokumentation für Konformität