Namespaces
Variants

Preprocessor

From cppreference.net
C++ language
General topics
Preprocessor
Comments
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Der Präprozessor wird in Übersetzungsphase 4 ausgeführt, vor der Kompilierung. Das Ergebnis der Präprozessierung ist eine einzelne Datei, die dann an den eigentlichen Compiler übergeben wird.

Inhaltsverzeichnis

Direktiven

Die Präprozessordirektiven steuern das Verhalten des Präprozessors. Jede Direktive belegt eine Zeile und hat folgendes Format:

  • das # Zeichen.
  • eine Folge von:
  • ein standarddefinierter Direktivenname (aufgelistet unten ) gefolgt von den entsprechenden Argumenten, oder
  • ein oder mehrere Präprozessor-Tokens , bei denen das Anfangstoken kein standarddefinierter Direktivenname ist; in diesem Fall ist die Direktive bedingt unterstützt mit implementierungsdefinierter Semantik (z.B. eine häufige nicht-standardisierte 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 Wirkung.
  • ein Zeilenumbruch.

Die Modul- und Importdirektiven sind ebenfalls Präprozessordirektiven.

(since C++20)

Präprozessordirektiven dürfen nicht aus Makroexpansion stammen.

#define EMPTY
EMPTY   #   include <file.h> // keine Präprozessor-Direktive

Fähigkeiten

Der Präprozessor verfügt über folgende Quelltext-Übersetzungsfähigkeiten:

  • bedingt Teile der Quelldatei kompilieren (gesteuert durch Direktiven #if , #ifdef , #ifndef , #else , #elif , #elifdef , #elifndef (seit C++23) und #endif ).
  • ersetzen Textmakros unter möglicher Verkettung oder Quotierung von Bezeichnern (gesteuert durch Direktiven #define und #undef , sowie Operatoren # und ## ).
  • einbinden anderer Dateien (gesteuert durch Direktive #include und geprüft mit __has_include (seit C++17) ).
  • einen Fehler oder eine Warnung (seit C++23) verursachen (gesteuert durch Direktive #error oder #warning entsprechend (seit C++23) ).

Die folgenden Aspekte des Präprozessors können gesteuert werden:

  • Implementierungsdefiniertes Verhalten (gesteuert durch Direktive #pragma und Operator _Pragma (seit C++11) ). Zusätzlich unterstützen einige Compiler (in unterschiedlichem Maße) den Operator __pragma als nicht-standardisierte Erweiterung.
  • Dateinamen- und Zeileninformationen für den Präprozessor verfügbar (gesteuert durch Direktive #line ).

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 bei Verwendung nicht standarddefinierter Direktiven war unklar als bedingt unterstützt festgelegt

Siehe auch

C++ Dokumentation für Vordefinierte Makrosymbole
C++ Dokumentation für Makrosymbol-Index
C-Dokumentation für Präprozessor