¿Explicación de la macro insegura de C ++ FAQ?

De acuerdo con las preguntas frecuentes de C ++, las macros son malas:

[9.5] ¿Por qué debo usar funciones en línea en lugar de las macros #define antiguas?

Porque#define Las macros son malvadas en 4 formas diferentes: mal # 1, mal # 2, mal # 3 y mal # 4. A veces deberías usarlos de todos modos, pero siguen siendo malvados. diferente a#define macros, las funciones en línea evitan errores de macros infames, ya que las funciones en línea siempre evalúan cada argumento exactamente una vez. En otras palabras, invocar una función en línea es semánticamente igual que invocar una función normal, solo que más 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
}

Además, a diferencia de las macros, los tipos de argumentos se verifican y las conversiones necesarias se realizan correctamente.

Las macros son malas para tu salud; No los uses a menos que tengas que hacerlo.

¿Puede alguien explicar por qué esunsafe(x++) incrementosx ¿dos veces? No soy capaz de averiguar.

Respuestas a la pregunta(4)

Su respuesta a la pregunta