Пусть есть макрос:
#define F(x, y) x * x + y
Видите проблему? Если нет, обязательно дочитайте до конца.
Берем такую реализацию:
F(a, b) -> a * a + b
Вроде как все замечательно и будет работать. Проект закрыт. А через год делаем небольшую правку
F(a + c, b) -> a + c * a + c + b
И в этом моменте мы начинаем хвататься за голову и думать что-же такое случилось. А случился попросту говнокод. Чтобы так не было достаточно небольшого изменения:
#define F(x, y) (x) * (x) + (y)
Окей, а потом мы делаем еще одну правку:
F(a + c, b) * d -> (a + c) * (a + c) + (b) * d
И опять хватаемся за голову. Потому, что мы забыли еще в одном месте себя обезопасить
#define F(x, y) ((x) * (x) + (y))
Используя макросы - всегда - просто заведите себе за правило - всегда оборачивайте аргументы и всю функцию. Простая гигиена сэкономит тучу времени на отладку странного поведения.