Makros definieren (2/2)

Ä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.“