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;
// 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;
// Mehrfacheinbindung von DATEI.h verhindern #ifndef DATEI.h #define DATEI.h /* * Quelltext der vor * Mehrfacheinbindung * geschützt werden soll */ #endif
// 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; }
// 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";