Сложность отладки - одна из причин, по которой следует избегать макросов.Нет, вы не можете отлаживать команды макросов построчно, вы не можете устанавливать точки останова в макросе, вы не можете видеть значения переменных в макросе и т. Д. Причины как минимум две:
Технические .Компилятор вообще ничего не знает о расширении макросов.Все макросы раскрываются препроцессором до вызова компилятора.Компилятор не сможет добавить отладочную информацию для адресации строк макросов, у компилятора ее нет!Таким образом, отладчик может только предполагать, как именно препроцессор выполняет расширение макроса.
Logical .Выходная команда кода C ++ не обязательно соответствует одной строке (одной) макрокоманды.Структурно и синтаксически, макрокод может совершенно не походить на код C ++.Такая построчная отладка макросов кажется логичной только для простых примеров, подобных вашему, где результирующий код C ++ легко просматривается (легко для вас, а не для отладчика!).Но рассмотрим более замысловатый пример.На какую строку должен указывать отладчик в этом примере?Я думаю ASSIGN(VAR(INT, i), 10);
единственная логическая опция.
#define INT int
#define VAR(TYPE, NAME) TYPE NAME
#define ASSIGN(V, VAL) V = VAL
ASSIGN(VAR(INT, i), 10);
Вы не можете отлаживать макросы как код С ++, так как они не являются непосредственно кодом С ++!Тем не менее, вы можете расширить макрос для отладки в соответствии с рекомендациями.Если вам нужна гибкость, такая как макросы, но без проблем с отладкой, используйте функции шаблонов.