Разбираем, почему ошибки из-за макросов часто «вылетают» не в месте вызова, а в неожиданной строке: компилятор видит уже раскрытый текст после этапа препроцессора (
#include,
#define,
#if). Учимся смотреть на «препроцессированный файл», ловить ловушки приоритета операторов (
SQUARE и
*/
+), повторного вычисления аргумента (
++), и делать безопасные макросы через
do { ... }
while(
false). В конце — рефакторинг: макрос оставляем только ради
__FILE__/
__LINE__, а логику переносим в обычную C++-функцию.