Основная идея #define заключается в том, что это просто директива препроцессора, а это означает, что это:
#define unsafe(i) ( (i) >= 0 ? (i) : -(i) )
предварительно обработает ваш код перед его компиляцией и заменит оператор
unsafe(x++);
со следующим
((x++) >= 0 ? (x++) : -(x++));
Каждый раз, когда вычисляется x++, x увеличивается.
Одна из возможных причин, по которой у вас возникают проблемы с правильным получением этого примера кода, может заключаться в том, что вы компилируете свой код с оптимизацией, которая оптимизирует весь неиспользуемый/ненужный код.
Если вы нигде не используете свой x, то он считается неиспользуемым и, следовательно, не включается в скомпилированный код.
07.12.2013