Anhang K
Makro Definitionen
Die dritte und letzte Form der #define-Anweisung
#define MAKRO AUSDRUCK
definiert ein Makro. Ein Makro ist nichts anderes als eine Kurzschreibweise für beliebige Anweisungen. Trifft der Präprozessor auf den Namen eines Makros, wird das Makro durch die bei der Makrodefinition angegebenen Anweisungen ersetzt. Erstrecken sich die Anweisungen eines Makros über mehrere Zeilen, sind die Zeilen mit einem Backslash-Zeichen abzuschließen.
#include <print>
// Makro-Definition
#define CHECK_ERROR \
if (error != 0) \
{ std::println("Fehler!"); exit(error); }
int main()
{
int error = 0; // Fehlerzustand
//...weitere Anweisungen
error = 1;
CHECK_ERROR
std::println("Kein Fehler aufgetreten!");
}
Innerhalb eines Makros das über mehrere Zeilen geht, darf niemals der Einzeilen-Kommentar // stehen! Durch das Backslash-Zeichen am Zeilenende wird ansonsten alles, was nach dem Kommentar steht, ebenfalls als Kommentar interpretiert.
Zusätzlich können Makros Parameter besitzen. Die Parameter werden, genauso wie bei Funktionen, in Klammern eingeschlossen und mehrere Parameter werden durch Komma voneinander getrennt. Beachten Sie, dass hier nur Parameternamen stehen und keine Datentypen wie bei Funktionen, da die #define-Anweisung vom Präprozessor verarbeitet wird und nicht vom Compiler!
#include <print>
// Makro-Definitionen
#define CAREA1(rad) 3.14/4.0*(rad)*(rad)
// Das gleiche Makro, nur andere Schreibweise
#define CAREA2(rad) 3.14/4.0*rad*rad
int main ()
{
double erg; // Variable für Ergebnis
double val; // 'Makro-Argument'
val = 1.2;
// Folgende Anweisung wird erweitert zu:
// erg = 3.14/4.0*(val+2.)*(val+2.);
erg = CAREA1(val+2.);
std::println("CAEAR1 = {:.4}",erg);
// Folgende Anweisung wird erweitert zu:
// erg = 3.14/4.0*val+2.*val+2.;
// (Punkt- vor Strichrechnung!)
erg = CAREA2(val+2.);
std::println("CAEAR2 = {:.4}",erg);
}
CAEAR1 = 8.038
CAEAR2 = 5.342
Solche Makros sind, wie bereits erwähnt, eigentlich ein Überbleibsel aus vergangenen Tagen und sehr fehleranfällig. Sehen Sie sich einmal die Definition des Makros CAREA2 und den daraus resultierenden Code an. Für solche kleinen Funktionen sollten besser inline-Funktionen oder Lambdas eingesetzt werden, die später noch behandelt werden