Ähnliche Probleme können auch bei Berechnungen auftauchen, hier können die Präferenzen der Operatoren die Probleme verursachen. So ergeben sich z.B. bei folgendem Makro Probleme:
#define Quadrat(x) x*x
Die zwei Fälle, wo mit diesem Makro Probleme auftauchen, sind durch folgenden Code abgedeckt:
Quadrat(5+3); // ergibt 5+3*5+3 = 23 statt 64 Quadrat(5)++;; // ergibt 5*5++ = 30 statt 26
Im Falle von Berechnungen kann man solche Probleme dadurch umgehen, daß man sowohl die Argumente des Makros, als auch das Makro selbst in Klammern setzt, also statt dessen
#define Quadrat(x) ((x)*(x))
schreibt. Scheitern wird dieses Makro aber immer noch an:
int x=3; Quadrat (x++); // ergibt ((x++)*(x++)), somit 3*4=12, nicht 9
Allgemein sollte man Funktionen vorziehen, da Fehler, die über
Makros entstehen, nur sehr schwer zu finden sind. Makros sollten nach
Möglichkeit immer vermieden werden. Der Entwickler der Sprache,
Bjarne Stroustrup, sagt in der Sprachreferenz 'The C++ Programming
Language', 3.Ed.
auf Seite 160:
Almost every macro demonstrates a flaw in the programming language, in the program, or in the programmer.