Präprozessor
Von cppreference.com
< cpp
Der Präprozessor wird in Übersetzungsphase 4, vor der Kompilierung, ausgeführt. Das Ergebnis der Vorverarbeitung ist eine einzige Datei, die dann an den eigentlichen Compiler übergeben wird.
Inhalt |
[bearbeiten] Direktiven
Die Präprozessor-Direktiven steuern das Verhalten des Präprozessors. Jede Direktive belegt eine Zeile und hat das folgende Format:
- das Zeichen #.
- eine Sequenz von
- einem standarddefinierten Direktivenamen (siehe unten) gefolgt von den entsprechenden Argumenten, oder
- ein oder mehrere Präprozessor-Tokens, wobei das erste Token kein standarddefinierter Direktivenname ist. In diesem Fall ist die Direktive bedingt unterstützt mit implementierungsdefinierten Semantiken (z.B. eine gängige nicht-standardmäßige Erweiterung ist die Direktive #warning, die eine benutzerdefinierte Meldung während der Kompilierung ausgibt)(bis C++23), oder
- nichts, in diesem Fall hat die Direktive keine Auswirkung.
- ein Zeilenumbruch.
|
Die Direktiven module und import sind ebenfalls Präprozessor-Direktiven. |
(seit C++20) |
Präprozessor-Direktiven dürfen nicht aus Makroexpansionen stammen.
#define EMPTY EMPTY # include <file.h> // not a preprocessing directive
[bearbeiten] Fähigkeiten
Der Präprozessor hat die folgenden Fähigkeiten zur Übersetzung von Quelldateien:
- bedingtes Kompilieren von Quellcodedateiteilen (gesteuert durch die Direktiven #if, #ifdef, #ifndef, #else, #elif, #elifdef, #elifndef(seit C++23) und #endif).
- Ersetzen von Textmakros, möglicherweise durch Verketten oder Quoting von Bezeichnern (gesteuert durch die Direktiven #define und #undef sowie die Operatoren # und ##).
- Einbinden anderer Dateien (gesteuert durch die Direktive #include und geprüft mit __has_include(seit C++17)).
- Auslösen eines Fehlers oder einer Warnung(seit C++23) (gesteuert durch die Direktive #error oder #warning entsprechend(seit C++23)).
Die folgenden Aspekte des Präprozessors können gesteuert werden:
- implementierungsdefinierte Verhaltensweisen (gesteuert durch die Direktive #pragma und den Operator _Pragma(seit C++11)). Darüber hinaus unterstützen einige Compiler (in unterschiedlichem Maße) den Operator __pragma als nicht-standardmäßige Erweiterung.
- Dateinamen und Zeileninformationen, die dem Präprozessor zur Verfügung stehen (gesteuert durch die Direktive #line).
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| CWG 2001 | C++98 | Das Verhalten der Verwendung nicht-standarddefinierter Direktiven war unklar | Wurde bedingt unterstützt gemacht |
[bearbeiten] Siehe auch
| C++ Dokumentation für Vordefinierte Makrosymbole
| |
| C++ Dokumentation für Makro-Symbolindex
| |
| C Dokumentation für Präprozessor
|