C++ Makros

Verwendung von Makros als Präprozessoranweisung. Erklärung und Beispiele zu #define, #undef, #if, #elif, #else, #endif, #ifdef, #ifndef



Makros in C++
In C und C++ können dem Präprozessor Makros übergeben weden. Diese Makros können dann später im Programm ein- und auch wieder ausgeschaltet werden. Nützlich ist dies etwa um für den Compilierungsvorgang extra Informationen auszugeben, die im späteren (fertigen) Programm natürlich nicht erwünscht sind.


Was ist ein Präprozessor?
Der Präprozessor selber ist ein reines zeilenorientiertes Textersetzungsprogramm, welches vor dem C++-Compiler ausgeführt wird. Dadurch kann zur Laufzeit auch keine Änderung mehr vorgenommen werden. Präprozessoranweisungen können an jedem Ort im Quellcode stehen und fangen grundsätzlich mit >>#<< an!

Möchte man mehrzeilige Anweisugen schreiben, so muss vor jedem Anweisungsende (da ja zeilenorientiert) ein Backslash \ hinzugefügt werden.

Hinweis:
Seien Sie beim definieren von Makros vorsichtig mit Semikolons, da diese durch den Präprozessor im Programm natürlich auch durch die entsprechenden Teilstücke ersetzt werden!


Was kann man mit Makros alles bewerkstelligen?
Mit Makros können folgende Dinge realisiert werden:
* Einfügen von Dateien
* Text im Quelltext erseten
* Kompilierung von Bedingungen
* Umwandlung von Strings in Parameter


#define-Anweisung
Mit >>#define<< kann eine sukzessive Ersetzung eingeleitet werden

// Alles Vorkommen von MAXIMUM gegen 1000 tauschen
#define MAXIMUM 1000
 
 
//Alles Vorkommen von MINIMUM gegen MAXIMUM dividiert durch 2
// ersetzen, also MINIMUM = 1000/2 = 500
#define MINIMUM (MAXIMUM/2)
 
 
// Alles Vorkommen von DBGOUT() gegen cout tauschen und
// Inhalt von DBGOUT() an cout übergeben
#define DBGOUT(inhalt) cout << inhalt
 
 
 
cout << "Maximum = " << MAXIMUM << endl;
cout << "Minimum = " << MINIMUM << endl;
DBGOUT("Hallo Welt" << endl);
// Programm nach Präprozessorausführung
cout << "Maximum = " << 1000 << endl;
cout << "Minimum = " << 500 << endl;
cout << "Hallo Welt" << endl;
#undef-Anweisung
Mit >>#undef<< kann eine zuvor definierte #define-Anweisung aufgehoben werden. Somit kann kann die Gültigkeit begrenzt werden.

// Alles Vorkommen von MAXIMUM gegen 1000 tauschen
#define MAXIMUM 1000
cout << "Maximum = " << MAXIMUM << endl;
 
 
// von nun an MAXIMUM gegen 500 tauschen
#undef MAXIMUM 500
cout << "Maximum = " << MAXIMUM << endl;
// Programm nach Präprozessorausführung
cout << "Maximum = " << 1000 << endl;
cout << "Maximum = " << 500 << endl;
#ifndef und #define
über >>#ifndef<< und >>#define<< Mehrfacheinbindung von Quelltext verhindern.
// Mehrfacheinbindung von DATEI.h verhindern
#ifndef DATEI.h
#define DATEI.h
 
 
/*
* Quelltext der vor
* Mehrfacheinbindung
* geschützt werden soll
*/
 
 
#endif
#ifdef
Typdefinition per >>#ifdef<< realisieren
// WENN AS_SHORT_INT nicht auskommentiert, dann NEW_INT = short
#define AS_SHORT_INT
 
// WENN AS_LONG_INT nicht auskommentiert, dann NEW_INT = long
//#define AS_LONG_INT
 
#ifdef AS_SHORT_INT
  typedef long NEW_INT
#ifdef AS_LONG_INT
  typedef short NEW_INT
#endif
 
 
 
int main()
{
  INT i = 1000;
  INT j = 500;
 
  return 0;
}
 
#if, #elif, #else und #endif Anweisung
Mit diesen Direktiven können normale If-Anweisungen aufgebaut werden
#if definiert den Einstiegspunkt der Anweisung
#elif definiert eine >>else if<<-Anweiung mit der weitere Bedingungen definiert werden kann
#else trifft zu, wenn kein #if und #elif zugetroffen ist
#endif definiert den Endpunkt der If-Anweisung
// Zahl festlegen, die später überprüft werden soll
#define ZAHL 1000
 
 
// Definierte Zahl überprüfen
#if ZAHL < 1000
  #define OUTPUT "kleiner 1000"
#elif ZAHL > 1000
  #define OUTPUT "groesser 1000"
#elif ZAHL == 1000
  #define OUTPUT "gleich 1000"
#else
  #define OUTPUT "keine Aussage möglich"
#endif
 
 
cout << OUTPUT;
// Ausgabe nach Präprozessoraufruf
 
cout << "gleich 1000";