В общем, у меня иногда бывает цепочка вложенных макросов с несколькими условными элементами препроцессора в их определениях. Их может быть сложно отлаживать, поскольку трудно непосредственно увидеть выполняемый код.
Некоторое время назад я смутно помню, как нашел флаг компилятора (gcc) для их расширения, но у меня были проблемы с тем, чтобы заставить это работать на практике.





gcc -E выведет предварительно обработанный исходный код на стандартный вывод.
Отладьте разборку с загруженными символами.
Для пользователей MSVC вы можете щелкнуть правой кнопкой мыши файл / проект, просмотреть настройки и изменить свойства файла для вывода предварительно обработанного источника (который обычно находится в каталоге obj).
Проголосуйте за совет, но я должен сказать, что обработанный файл хуже, чем просмотр макроса самостоятельно (особенно, если макрос занимает несколько строк). По какой-то причине десятки тысяч строк состоят из множества пустых строк, заполняющих большую часть документа.
Это может быть неприменимо в вашей ситуации, но макросы действительно затрудняют отладку и часто используются чрезмерно, и их можно избежать.
Можете ли вы заменить их встроенными функциями или как-то иначе избавиться от них всех вместе?
Спасибо; хороший совет. Я спрашивал не из-за конкретной ситуации, а потому, что у меня были проблемы с этим в прошлом, и я ожидаю большего в будущем. Большая часть поддерживаемого мной кода (в основном написанного не мной) широко использует макросы, поэтому все еще полезно иметь возможность их отлаживать.
Я поддержал, но, к сожалению, многим из нас нужна эта информация, потому что нам остается отлаживать макросы, используемые ленивыми, некомпетентными людьми или полагающими, что частое и плодотворное использование макросов является «хорошим дизайном».
Вам, вероятно, следует начать отходить от макросов и начать использовать встроенные и шаблоны.
Макросы - это старый инструмент, иногда подходящий. В крайнем случае помните, что printf - ваш друг (и на самом деле printf не такой уж плохой друг, когда вы делаете многопоточные вещи)
GCC и совместимые компиляторы используют параметр -E для вывода предварительно обработанного исходного кода в стандартный формат.
gcc -E foo.cpp
Sun Studio также поддерживает этот флаг:
CC -E foo.cpp
Но даже лучше -xdumpmacros. Вы можете найти дополнительную информацию в документах Suns.
gcc -save-temps запишет файл .i (или файл .ii для C++), который является выходом препроцессора C, прежде чем он будет передан компилятору. Это часто может быть поучительным.
gcc с измененными тегами, основанный на содержании