Namensräume
Varianten
Aktionen

Präprozessor

Von cppreference.com
< cpp
 
 
C++ Sprache
Allgemeine Themen
Präprozessor
Kommentare
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

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