C++ Präprozessor: Direktiven formen Ihren Code
Präprozessor-Direktiven geben dem Compiler Anweisungen zur Vorverarbeitung vor der eigentlichen Kompilierung.
- Beginnen mit
# - Nur Whitespace davor erlaubt
- Keine C++-Statements → kein Semikolon
Bekannt: #include bindet Header-Datei ein. Weitere: #define, #if, #else, #line etc.
#define Präprozessor
Erzeugt symbolische Konstanten (Makros):
#define MAKRO-NAME ERSETZUNGSTEXT
Alle nachfolgenden Vorkommen von MAKRO in der Datei werden vor Kompilierung durch ERSETZUNGSTEXT ersetzt.
#include <iostream>
using namespace std;
#define PI 3.14159
int main() {
cout << "Value of PI: " << PI << endl;
return 0;
}
Präprozessierung (gcc -E test.cpp > test.p) zeigt:
int main() {
cout << "Value of PI: " << 3.14159 << endl;
return 0;
}
Funktionsähnliche Makros
#define mit Argumenten:
#include <iostream>
using namespace std;
#define MIN(a,b) (((a)<(b)) ? a : b)
int main() {
int i=100, j=30;
cout << "The minimum is " << MIN(i,j) << endl;
return 0;
}
Ausgabe: The minimum is 30
Bedingte Kompilierung
Selektives Kompilieren von Quellcode-Abschnitten. Struktur ähnlich if.
#ifndef NULL
#define NULL 0
#endif
Debugging an/aus per Makro:
#ifdef DEBUG
cerr << "Variable x = " << x << endl;
#endif
cerr wird nur kompiliert, wenn DEBUG vor #ifdef DEBUG definiert wurde.
Code auskommentieren:
#if 0
code prevented from compiling
#endif
Beispiel
#include <iostream>
using namespace std;
#define DEBUG
#define MIN(a,b) (((a)<(b)) ? a : b)
int main() {
int i=100, j=30;
#ifdef DEBUG
cerr << "Trace: Inside main function" << endl;
#endif
#if 0
cout << MKSTR(HELLO C++) << endl;
#endif
cout << "The minimum is " << MIN(i,j) << endl;
#ifdef DEBUG
cerr << "Trace: Coming out of main function" << endl;
#endif
return 0;
}
Ausgabe:
The minimum is 30
Trace: Inside main function
Trace: Coming out of main function
# und ## Operatoren
# (Stringizing): Ersetzt Argument durch String in Anführungszeichen.
#define MKSTR(x) #x
cout << MKSTR(HELLO C++) << endl; // → "HELLO C++"
## (Token Pasting): Verknüpft zwei Tokens.
#define CONCAT(x,y) x##y
int xy = 100;
cout << CONCAT(x,y); // → xy → 100
Vordefinierte C++ Makros
| Nr. | Makro & Beschreibung |
|---|---|
| 1 | __LINE__ – Aktuelle Zeilennummer beim Kompilieren |
| 2 | __FILE__ – Aktueller Dateiname |
| 3 | __DATE__ – Kompilierdatum (Monat/Tag/Jahr) |
| 4 | __TIME__ – Kompilierzeit (Stunde:Minute:Sekunde) |
#include <iostream>
using namespace std;
int main() {
cout << "__LINE__: " << __LINE__ << endl;
cout << "__FILE__: " << __FILE__ << endl;
cout << "__DATE__: " << __DATE__ << endl;
cout << "__TIME__: " << __TIME__ << endl;
return 0;
}
Beispielausgabe:
__LINE__: 6
__FILE__: test.cpp
__DATE__: Feb 28 2011
__TIME__: 18:52:48
C Sprache
- C#-Präprozessordirektiven meistern: Ein praktischer Leitfaden
- C++-Datentypen verstehen: Grundlagen, Modifizierer und Best Practices
- C++-Operatoren meistern: Ein vollständiger Leitfaden mit praktischen Beispielen
- C++-Kommentare: Best Practices für lesbaren, wartbaren Code
- C++-Konstruktoren verstehen: Standard-, Parameter- und Kopierkonstruktor erklärt
- C++ Klassentemplates meistern: Ein praktischer Leitfaden
- Der C-Präprozessor (CPP) verstehen: Wie er die Kompilierung vereinfacht
- C++ Programmiersprache: Überblick & Kernfeatures
- C++ Konstanten & Literale: Typen, Syntax & Best Practices
- C++ Operatoren: Typen, Nutzung & Best Practices