Phases of translation
Die C-Quelldatei wird vom Compiler verarbeitet, als ob die folgenden Phasen in exakt dieser Reihenfolge ablaufen würden. Die tatsächliche Implementierung kann diese Aktionen kombinieren oder anders verarbeiten, solange das Verhalten dasselbe bleibt.
Inhaltsverzeichnis |
Phase 1
- Das source character set ist ein Multibyte-Zeichensatz, der das basic source character set als Einzelbyte-Teilmenge enthält, bestehend aus den folgenden 96 Zeichen:
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
Wenn die Eingabe bis zu einem bestimmten Zeichen in Präprozessor-Token zerlegt wurde, wird das nächste Präprozessor-Token im Allgemeinen als die längste Zeichenfolge genommen, die ein Präprozessor-Token bilden könnte, selbst wenn dies dazu führt, dass die nachfolgende Analyse fehlschlägt. Dies ist allgemein bekannt als maximal munch .
int foo = 1; // int bar = 0xE+foo; // Fehler: ungültige Präprozessor-Zahl 0xE+foo int bar = 0xE/*Kommentar wird zu einem Leerzeichen expandiert*/+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; // Fehler: bar++ ++ +baz, nicht bar++ + ++baz int qux = bar+++/*Rettender Kommentar*/++baz; // OK: bar++ + ++baz
Die einzige Ausnahme von der Maximal-Munch-Regel ist:
- Header-Name-Präprozessortoken werden nur innerhalb einer #include oder #embed (seit C23) Direktive, in __has_include und __has_embed Ausdrücken (seit C23) und in implementierungsdefinierten Positionen innerhalb einer #pragma Direktive gebildet.
#define MACRO_1 1 #define MACRO_2 2 #define MACRO_3 3 #define MACRO_EXPR (MACRO_1 <MACRO_2> MACRO_3) // OK: <MACRO_2> ist kein Header-Name
Phase 4
Phase 5
Hinweis: Die bei dieser Stufe durchgeführte Konvertierung kann in einigen Implementierungen durch Kommandozeilenoptionen gesteuert werden: gcc und clang verwenden - finput - charset zur Angabe der Kodierung des Quellzeichensatzes, - fexec - charset und - fwide - exec - charset zur Angabe der Kodierungen des Ausführungszeichensatzes in den Zeichenkettenliteralen und Zeichenkonstanten ohne Kodierungspräfix (seit C11) .
Phase 6
Benachbarte String-Literale werden verkettet.
Phase 7
Die Kompilation findet statt: Die Tokens werden syntaktisch und semantisch analysiert und als Übersetzungseinheit übersetzt.
Phase 8
Das Linking findet statt: Übersetzungseinheiten und Bibliothekskomponenten, die benötigt werden, um externe Referenzen zu erfüllen, werden in ein Programmabbild zusammengeführt, das die für die Ausführung in seiner Ausführungsumgebung (dem Betriebssystem) benötigten Informationen enthält.
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 5.1.1.2 Übersetzungsphasen (S: TBD)
-
- 5.2.1 Zeichensätze (S: TBD)
-
- 6.4 Lexikalische Elemente (S: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 5.1.1.2 Übersetzungsphasen (S: 9-10)
-
- 5.2.1 Zeichensätze (S: 17)
-
- 6.4 Lexikalische Elemente (S: 41-54)
- C11-Standard (ISO/IEC 9899:2011):
-
- 5.1.1.2 Übersetzungsphasen (S: 10-11)
-
- 5.2.1 Zeichensätze (S: 22-24)
-
- 6.4 Lexikalische Elemente (S: 57-75)
- C99-Standard (ISO/IEC 9899:1999):
-
- 5.1.1.2 Übersetzungsphasen (S: 9-10)
-
- 5.2.1 Zeichensätze (S: 17-19)
-
- 6.4 Lexikalische Elemente (S: 49-66)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 2.1.1.2 Übersetzungsphasen
-
- 2.2.1 Zeichensätze
-
- 3.1 Lexikalische Elemente
Siehe auch
|
C++ Dokumentation
für
Phasen der Übersetzung
|