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.