В соответствии с часто задаваемыми вопросами С++ макросы являются злыми:
[9.5] Почему я должен использовать встроенные функции вместо обычного старого #define макросы?
Потому что
#define
макросы являются злыми по-разному: зло # 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
дважды? Я не могу понять.