Объяснение небезопасного макроса C ++ FAQ?

Согласно C ++ FAQ, макросы - это зло:

[9.5] Почему я должен использовать встроенные функции вместо простых старых макросов #define?

Потому что#define Макросы являются злом в 4 разных направлениях: зло № 1, зло № 2, зло № 3 и зло № 4. Иногда вы должны использовать их в любом случае, но они все еще злые. в отличие#define макросы, встроенные функции позволяют избежать печально известных ошибок макросов, поскольку встроенные функции всегда оценивают каждый аргумент ровно один раз. Другими словами, вызов встроенной функции семантически аналогичен вызову обычной функции, только быстрее:

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

Также, в отличие от макросов, типы аргументов проверяются, и необходимые преобразования выполняются правильно.

Макросы вредны для вашего здоровья; не используйте их, если не нужно.

Может кто-нибудь объяснить, почемуunsafe(x++) приращенийx дважды? Я не могу понять.

Ответы на вопрос(4)

Ваш ответ на вопрос