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.