Wyjaśnienie niebezpiecznego makra C ++ FAQ?

Zgodnie z FAQ C ++ makra są złe:

[9.5] Dlaczego powinienem używać funkcji inline zamiast zwykłych starych makr #define?

Bo#define Makra są złe na 4 różne sposoby: zła # 1, zła # 2, zła # 3 i zła # 4. Czasem powinieneś ich używać, ale nadal są złe. w odróżnieniu#define makra, funkcje inline unikają niesławnych błędów makr, ponieważ funkcje inline zawsze oceniają każdy argument dokładnie raz. Innymi słowy, wywołanie funkcji inline jest semantycznie tak samo jak wywołanie zwykłej funkcji, tylko szybciej:

// 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
}

W przeciwieństwie do makr, typy argumentów są sprawdzane, a niezbędne konwersje są wykonywane poprawnie.

Makra są szkodliwe dla zdrowia; nie używaj ich, chyba że musisz.

Czy ktoś może wyjaśnić, dlaczego tak jestunsafe(x++) przyrostyx dwa razy? Nie jestem w stanie tego zrozumieć.

questionAnswers(4)

yourAnswerToTheQuestion