Gefahren bei der Verwendung von Makros

07.03.2008

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 hier
    CPP - 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 damit
    CPP - 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 obiges
    CPP - Code:
    5 + ((2)>(3)?(2):(3))

    eingesetzt und aufgrund der Klammern zu
    CPP - 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 folgendes
    CPP - Code:
    #define MAX (a,b) ( (a) > (b) ? (a) : (b) )

    das Makro MAX ohne Parameter. Würde man
    CPP - Code:
    MAX (3, 2)
    verwenden, so wird daraus
    CPP - 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 Anweisung
    CPP - Code:
    ABS (++x)

    zu
    CPP - 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:


Es wurden noch keine Kommentare geposted.

Sei der Erste und teile uns Deine Meinung mit.

Einen neuen Kommentar erstellen...