Freestanding and hosted implementations
La norme C++ définit deux types d'implémentations : hosted et freestanding . Pour les implémentations hosted , l'ensemble des en-têtes de bibliothèque standard requis par la norme C++ est beaucoup plus important que pour les implémentations freestanding . Dans une implémentation freestanding , l'exécution peut se produire sans système d'exploitation.
Le type de l'implémentation est défini par l'implémentation.
La macro prédéfinie
__STDC_HOSTED__
est développée en
1
pour les implémentations hébergées et en
0
pour les implémentations autonomes.
(depuis C++11)
Exigences relatives aux exécutions multithread et aux courses de données
|
(depuis C++11) |
Exigences relatives à la fonction main
| freestanding | hosted |
|---|---|
| Dans une implémentation freestanding , il est défini par l'implémentation si un programme doit définir une fonction main . Le démarrage et la terminaison sont définis par l'implémentation ; le démarrage contient l'exécution des constructors pour les objets de namespace scope avec une durée de stockage statique ; la terminaison contient l'exécution des destructors pour les objets avec une storage duration statique. |
Dans une implémentation
hosted
, un programme doit contenir une fonction globale appelée
main
. L'exécution d'un programme démarre un
thread of execution
principal dans lequel la fonction
main
est invoquée, et dans lequel les variables de
storage duration
statique peuvent être initialisées et détruites.
|
Exigences concernant les en-têtes de la bibliothèque standard
Une implémentation autonome possède un ensemble d'en-têtes défini par l'implémentation. Cet ensemble inclut au moins les en-têtes du tableau suivant.
Pour les en-têtes partiellement autonomes, les implémentations autonomes doivent uniquement fournir une partie des entités dans la synopsis correspondante :
- Si une entité est commentée // freestanding , il est garanti qu'elle est fournie.
|
(depuis C++26) |
- Si une entité est déclarée dans un en-tête dont la synopsis commence par all freestanding ou // mostly freestanding , il est garanti qu'elle est fournie si l'entité elle-même n'est pas commentée.
En-têtes requis pour une implémentation autonome
| Bibliothèque | Composant | En-têtes | Autonome |
|---|---|---|---|
| Support du langage | Définitions communes | <cstddef> | Tous |
| Bibliothèque standard C | <cstdlib> | Partiel | |
| Propriétés d'implémentation |
<cfloat>
<climits> (depuis C++11) <limits> <version> (depuis C++20) |
Tous | |
| Types entiers | <cstdint> (depuis C++11) | Tous | |
| Gestion dynamique de la mémoire | <new> | Tous | |
| Identification de type | <typeinfo> | Tous | |
| Emplacement source | <source_location> (depuis C++20) | Tous | |
| Gestion des exceptions | <exception> | Tous | |
| Listes d'initialisation | <initializer_list> (depuis C++11) | Tous | |
| Comparaisons | <compare> (depuis C++20) | Tous | |
| Prise en charge des coroutines | <coroutine> (depuis C++20) | Tous | |
| Autres supports d'exécution | <cstdarg> | Tous | |
| Support de débogage | <debugging> (depuis C++26) | Tous | |
| Concepts | <concepts> (depuis C++20) | Tous | |
| Diagnostics | Numéros d'erreur | <cerrno> (depuis C++26) | Partiel |
| Prise en charge des erreurs système | <system_error> (depuis C++26) | Partielle | |
| Gestion de la mémoire | Mémoire | <memory> (depuis C++23) | Partiel |
| Métaprogrammation | Traits de type | <type_traits> (depuis C++11) | Tous |
| Arithmétique rationnelle à la compilation | <ratio> (depuis C++23) | Tous | |
| Utilitaires généraux | Composants utilitaires | <utility> (depuis C++23) | Tous |
| Tuples | <tuple> (depuis C++23) | Tous | |
| Objets fonction | <functional> (depuis C++20) | Partiel | |
| Conversions numériques primitives | <charconv> (depuis C++26) | Partiel | |
| Manipulation de bits | <bit> (depuis C++20) | Tous | |
| Chaînes de caractères | Classes de chaînes | <string> (depuis C++26) | Partiel |
|
Utilités de séquences
terminées par un caractère nul |
<cstring> (depuis C++26) | Partiel | |
| Traitement de texte |
Séquence terminée par un caractère nul
Utilitaires de séquence |
<cwchar> (depuis C++26) | Partiel |
| Itérateurs | <iterator> (depuis C++23) | Partiel | |
| Plages | <ranges> (depuis C++23) | Partiel | |
| Numérique |
Fonctions mathématiques
pour les types à virgule flottante |
<cmath> (depuis C++26) | Partiel |
| Génération de nombres aléatoires | <random> (depuis C++26) | Partiel | |
| Support de la concurrence | Atomics | <atomic> (depuis C++11) | Tous [1] |
| Contrôle d'exécution | <execution> (depuis C++26) | Partiel | |
| En-têtes dépréciés |
<ciso646>
(jusqu'à C++20)
<cstdalign> (depuis C++11) (jusqu'à C++20) <cstdbool> (depuis C++11) (jusqu'à C++20) |
Tous | |
- ↑ La prise en charge des types atomiques entiers toujours sans verrouillage et la présence des alias de type std::atomic_signed_lock_free et std::atomic_unsigned_lock_free sont définies par l'implémentation dans une implémentation autonome. (depuis C++20)
Notes
Certains fournisseurs de compilateurs peuvent ne pas prendre entièrement en charge l'implémentation autonome. Par exemple, GCC libstdc++ a connu des problèmes d'implémentation et de compilation avant la version 13, tandis que LLVM libcxx et MSVC STL ne prennent pas en charge le mode autonome.
En C++23, de nombreuses fonctionnalités sont rendues autonomes avec des en-têtes partiels. Cependant, il est encore en discussion au sein du WG21 si certains en-têtes seront rendus autonomes dans les futures normes. Quoi qu'il en soit, les conteneurs comme vector , list , deque , et map ne seront jamais autonomes en raison de leurs dépendances aux exceptions et au tas.
GCC 13 fournit davantage d'en-têtes, tels que <optional> , <span> , <array> , et <bitset> , pour l'environnement autonome, bien que ces en-têtes puissent ne pas être portables ou offrir les mêmes capacités qu'une implémentation hébergée. Il est préférable d'éviter de les utiliser dans un environnement autonome, même si la chaîne d'outils les fournit.
Références
- Norme C++23 (ISO/CEI 14882:2024) :
-
- 4.1 Conformité de l'implémentation [intro.compliance] (p: 10)
-
- 6.9.2 Exécutions multi-thread et courses aux données [intro.multithread] (p: 84)
-
- 6.9.3.1 Fonction main [basic.start.main] (p: 89)
-
- 16.4.2.5 Implémentations autonomes [compliance] (p: 483)
- Norme C++20 (ISO/CEI 14882:2020) :
-
- 4.1 Conformité de l'implémentation [intro.compliance] (p: 7)
-
- 6.9.2 Exécutions multi-thread et courses aux données [intro.multithread] (p: 77)
-
- 6.9.3.1 Fonction main [basic.start.main] (p: 82)
-
- 16.5.1.3 Implémentations autonomes [compliance] (p: 470)
- Norme C++17 (ISO/CEI 14882:2017) :
-
- 4.1 Conformité de l'implémentation [intro.compliance] (p: 5)
-
- 4.7 Exécutions multi-thread et courses aux données [intro.multithread] (p: 15)
-
- 6.6.1 Fonction main [basic.start.main] (p: 66)
-
- 20.5.1.3 Implémentations autonomes [compliance] (p: 458)
- Norme C++14 (ISO/CEI 14882:2014) :
-
- 1.4 Conformité de l'implémentation [intro.compliance] (p. 5)
-
- 1.10 Exécutions multithread et courses aux données [intro.multithread] (p. 11)
-
- 3.6.1 Fonction main [basic.start.main] (p. 62)
-
- 17.6.1.3 Implémentations autonomes [compliance] (p. 441)
- Norme C++11 (ISO/CEI 14882:2011) :
-
- 1.4 Conformité de l'implémentation [intro.compliance] (p: 5)
-
- 1.10 Exécutions multithread et courses aux données [intro.multithread] (p: 11)
-
- 3.6.1 Fonction main [basic.start.main] (p: 58)
-
- 17.6.1.3 Implémentations autonomes [compliance] (p: 408)
- Norme C++03 (ISO/CEI 14882:2003) :
-
- 1.4 Conformité de l'implémentation [intro.compliance] (p. 3)
-
- 3.6.1 Fonction main [basic.start.main] (p. 43)
-
- 17.4.1.3 Implémentations autonomes [lib.compliance] (p. 326)
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| CWG 1938 | C++98 |
une implémentation n'avait pas besoin
de documenter si elle est hébergée |
a rendu le type d'implémentation défini
par l'implémentation (nécessite donc une documentation) |
|
LWG 3653
( P1642R11 ) |
C++20 |
<coroutine>
est autonome, mais
utilise std::hash qui ne l'était pas |
a rendu
<functional>
partiellement
autonome |
Voir aussi
|
Documentation C
pour
Conformité
|