Во-первых, я настоятельно рекомендую встроенные функции. Есть очень мало вещей, которые макросы могут делать, и они не могут, и они гораздо чаще делают то, что вы ожидаете.
Одна ловушка макросов, которую я не видел в других ответах, - это теневое копирование имен переменных.
Предположим, вы определили:
#define A(x) { int temp = x*2; printf("%d\n", temp); }
И кто-то использовал это так:
int temp = 3;
A(temp);
После предварительной обработки код:
int temp = 3;
{ int temp = temp*2; printf("%d\n", temp); }
Это не работает, потому что внутренняя температура затеняет внешнюю.
Распространенным решением является вызов переменной __temp
, при условии, что никто не определит переменную с использованием этого имени (что является странным предположением, учитывая, что вы только что это сделали).