Bei Makros, die aus einem Ausdruck bestehen, ist es ratsam, nicht nur
den gesamten Ausdruck, sondern auch die einzelnen Argumente innerhalb
des Ausdrucks zu klammern.
Was das Fehlern der äußeren Klammern bewirkt, hast du bereits gesehen.
Folgendes liefert aber ebenfalls ein unerwartetes Ergebnis:
1 | #define check(a) ((a==1) ? 1 : 2)
|
2 |
|
3 | printf("%d\n", check(5 & 3));
|
Das bitweise Und von 5 und 3 ergibt 1, so dass man erwarten könnte, dass
"1" ausgegeben wird.
Tatsächlich wird das Makro aber in
expandiert. Da "==" stärker bindet als "&", ist das Ergebnis nicht 1,
sondern 2. Abhilfe schafft die Klammerung des Arguments a in der
Makrodefinition:
1 | #define check(a) (((a)==1) ? 1 : 2)
|
Die Klammer um den "=="-Teilausdruck kann man – je nach Geschmack – auch
weglassen:
1 | #define check(a) ((a)==1 ? 1 : 2)
|