Phases of translation
Le fichier source C est traité par le compilateur comme si les phases suivantes se déroulaient, dans cet ordre précis. L'implémentation réelle peut combiner ces actions ou les traiter différemment tant que le comportement reste identique.
Table des matières |
Phase 1
- Le jeu de caractères source est un jeu de caractères multioctet qui inclut le jeu de caractères source de base comme sous-ensemble mono-octet, constitué des 96 caractères suivants :
Phase 2
#include <stdio.h> #define PUTS p\ u\ t\ s /* Line splicing is in phase 2 while macros * are tokenized in phase 3 and expanded in phase 4, * so the above is equivalent to #define PUTS puts */ int main(void) { /* Use line splicing to call puts */ PUT\ S\ ("Output ends here\\ 0Not printed" /* After line splicing, the remaining backslash * escapes the 0, ending the string early. */ ); }
Phase 3
Si l'entrée a été analysée en tokens de prétraitement jusqu'à un caractère donné, le prochain token de prétraitement est généralement considéré comme la plus longue séquence de caractères qui pourrait constituer un token de prétraitement, même si cela devait entraîner l'échec de l'analyse ultérieure. Ceci est communément appelé maximal munch .
int foo = 1; // int bar = 0xE+foo; // erreur : nombre de prétraitement invalide 0xE+foo int bar = 0xE/*Comment expands to a space*/+foo; // OK : 0xE + foo int baz = 0xE + foo; // OK : 0xE + foo int pub = bar+++baz; // OK : bar++ + baz int ham = bar++-++baz; // OK : bar++ - ++baz // int qux = bar+++++baz; // erreur : bar++ ++ +baz, pas bar++ + ++baz int qux = bar+++/*Saving comment*/++baz; // OK : bar++ + ++baz
La seule exception à la règle de la prise maximale est :
- Les jetons de prétraitement de nom d'en-tête ne sont formés que dans une directive #include ou #embed (depuis C23) , dans les expressions __has_include et __has_embed (depuis C23) et dans des emplacements définis par l'implémentation au sein d'une directive #pragma .
#define MACRO_1 1 #define MACRO_2 2 #define MACRO_3 3 #define MACRO_EXPR (MACRO_1 <MACRO_2> MACRO_3) // OK : <MACRO_2> n'est pas un nom d'en-tête
Phase 4
Phase 5
Note : la conversion effectuée à cette étape peut être contrôlée par des options de ligne de commande dans certaines implémentations : gcc et clang utilisent - finput - charset pour spécifier l'encodage du jeu de caractères source, - fexec - charset et - fwide - exec - charset pour spécifier les encodages du jeu de caractères d'exécution dans les littéraux de chaîne et les constantes caractères qui n'ont pas de préfixe d'encodage (depuis C11) .
Phase 6
Les littéraux de chaîne adjacents sont concaténés.
Phase 7
La compilation a lieu : les jetons sont analysés syntaxiquement et sémantiquement et traduits en tant qu'unité de traduction.
Phase 8
La liaison a lieu : les unités de traduction et les composants de bibliothèque nécessaires pour satisfaire les références externes sont collectés dans une image de programme qui contient les informations nécessaires à l'exécution dans son environnement d'exécution (le système d'exploitation).
Références
- Norme C23 (ISO/IEC 9899:2024) :
-
- 5.1.1.2 Phases de traduction (p: TBD)
-
- 5.2.1 Jeux de caractères (p: TBD)
-
- 6.4 Éléments lexicaux (p: TBD)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 5.1.1.2 Phases de traduction (p: 9-10)
-
- 5.2.1 Jeux de caractères (p: 17)
-
- 6.4 Éléments lexicaux (p: 41-54)
- Norme C11 (ISO/IEC 9899:2011) :
-
- 5.1.1.2 Phases de traduction (p: 10-11)
-
- 5.2.1 Jeux de caractères (p: 22-24)
-
- 6.4 Éléments lexicaux (p: 57-75)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 5.1.1.2 Phases de traduction (p : 9-10)
-
- 5.2.1 Jeux de caractères (p : 17-19)
-
- 6.4 Éléments lexicaux (p : 49-66)
- Norme C89/C90 (ISO/CEI 9899:1990) :
-
- 2.1.1.2 Phases de traduction
-
- 2.2.1 Jeux de caractères
-
- 3.1 Éléments lexicaux
Voir aussi
|
Documentation C++
pour
Phases de traduction
|