Gefahren bei der Verwendung von Makros
07.03.2008
Author: N43
Mit Makros können schnell Fehler auftreten, die im Code nur schwer zu erkennen sind, da nur der Compiler, jedoch nicht der Nutzer den eingefügten Code sieht.
- Fallstrick 1:
Die Bedeutung des Codes ändert sich aufgrund der Operatoren Rangfolge, z.B.:CPP - Code:#define MAX(a,b) a>b?a:b
Setzt man hierCPP - Code:5 + MAX(2, 3)
ein, so wird folgendes daraus generiert:CPP - Code:5 + 2>3?2:3
Der Operator + wird vor dem Vergleich ausgeführt und liefert damitCPP - Code:7>3?2:3
und man erhält als Ergebnis 2, obwohl man eigentlich 8 erwartet hätte.
Um dies zu umgehen, sollte man jede Variable und den gesamten Ausdruck im Makro klammern.CPP - Code:#define MAX(a,b) ((a)>(b)?(a) : (b))
So wird für obigesCPP - Code:5 + ((2)>(3)?(2):(3))
eingesetzt und aufgrund der Klammern zuCPP - Code:5 + 3
ausgewertet und liefert dann auch wirklich, wie erwartet, 8. - Fallstrick 2:
Leerzeichen zu früh gesetzt, insbesondere, wenn man dem Makro Parameter übergeben will.
z.B. liefert folgendesCPP - Code:#define MAX (a,b) ( (a) > (b) ? (a) : (b) )
das Makro MAX ohne Parameter. Würde manCPP - Code:MAX (3, 2)verwenden, so wird darausCPP - Code:(a,b) ( (a) > (b) ? (a) : (b) ) (3, 2)und liefert unerkennbare Fehler. Das Leerzeichen zwischen MAX und (a,b) muss also entfernt werden. - Fallstrick 3:
Mehrmalige Auswertung übergebener Parameter.
Betrachtet man z.B. folgendes Makro:CPP - Code:#define ABS(x) ( (x) > 0 ? (x) : -(x) )
so wird die AnweisungCPP - Code:ABS (++x)
zuCPP - Code:( (++x) > 0 ? (++x) : - (++x) )
Galt vorher x = 5, so wird durch ABS(++x) 7 und nicht wie gewollt 6 zurückgegeben
Deine Meinung ist gefragt:
Sei der Erste und teile uns Deine Meinung mit.
Kommentare