Erklärung des unsicheren Makros von C ++ FAQ?

Makros sind laut C ++ FAQ böse:

[9.5] Warum sollte ich Inline-Funktionen anstelle von normalen alten #define-Makros verwenden?

weil#define Makros sind auf vier verschiedene Arten böse: Böse Nr. 1, Böse Nr. 2, Böse Nr. 3 und Böse Nr. 4. Manchmal solltest du sie trotzdem benutzen, aber sie sind immer noch böse. nicht wie#define Makros, Inline-Funktionen vermeiden berüchtigte Makrofehler, da Inline-Funktionen jedes Argument immer genau einmal auswerten. Mit anderen Worten, das Aufrufen einer Inline-Funktion ist semantisch genau wie das Aufrufen einer regulären Funktion, nur schneller:

// A macro that returns the absolute value of i
#define unsafe(i)  \
        ( (i) >= 0 ? (i) : -(i) )

// An inline function that returns the absolute value of i
inline
int safe(int i)
{
  return i >= 0 ? i : -i;
}

int f();

void userCode(int x)
{
  int ans;

  ans = unsafe(x++);   // Error! x is incremented twice
  ans = unsafe(f());   // Danger! f() is called twice

  ans = safe(x++);     // Correct! x is incremented once
  ans = safe(f());     // Correct! f() is called once
}

Auch im Gegensatz zu Makros werden Argumenttypen überprüft und notwendige Konvertierungen korrekt durchgeführt.

Makros sind schlecht für Ihre Gesundheit; benutze sie nicht, es sei denn du musst.

Kann mir jemand erklären warum das so istunsafe(x++) Inkrementex zweimal? Ich kann es nicht herausfinden.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage