Explicação da macro insegura do FAQ C ++?

De acordo com o FAQ do C ++, as macros são más:

[9.5] Por que eu deveria usar funções embutidas em vez de macros simples #define?

Porque#define macros são malignas de 4 maneiras diferentes: mal # 1, mal # 2, mal # 3 e mal # 4. Às vezes você deve usá-los de qualquer maneira, mas eles ainda são maus. Ao contrário#define macros, funções inline evitam erros de macros infames, pois as funções inline sempre avaliam cada argumento exatamente uma vez. Em outras palavras, invocar uma função inline é semanticamente como invocar uma função regular, apenas mais rápido:

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

Além disso, ao contrário das macros, os tipos de argumentos são verificados e as conversões necessárias são realizadas corretamente.

Macros são ruins para sua saúde; não os use a menos que você precise.

Alguém pode explicar por queunsafe(x++) incrementosx duas vezes? Eu não sou capaz de descobrir.

questionAnswers(4)

yourAnswerToTheQuestion