Есть ли хороший общий метод для отладки макросов на С++?

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

Некоторое время назад я смутно помню, как найти флаг компилятора (gcc) для их расширения, но мне не удалось заставить его работать на практике.

Ответы

Ответ 1

gcc -E выведет предварительно обработанный источник в stdout.

Ответ 2

Для пользователей MSVC вы можете щелкнуть правой кнопкой мыши файл/проект, просмотреть настройки и изменить свойства файла для вывода предварительно обработанного источника (который обычно находится в каталоге obj).

Ответ 3

Это может быть неприменимо в вашей ситуации, но макросы действительно затрудняют отладку и часто злоупотребляют и предотвращаются.

Можете ли вы заменить их встроенными функциями или иначе избавиться от них все вместе?

Ответ 4

Вероятно, вам следует начать отходить от формы Макросы и начать использовать встроенные и шаблоны.

Макросы - это старый инструмент, иногда подходящий инструмент. В крайнем случае помните, что printf - ваш друг (и на самом деле printf не так уж плох, когда вы делаете многопоточность)

Ответ 5

Отладить разборку с загруженными символами.

Ответ 6

gcc -save-temps будет выписывать файл .i(или .ii для С++), который является выходом препроцессора C, прежде чем он будет передан компилятору. Это часто может быть полезным.

Ответ 7

GCC и совместимые компиляторы используют параметр -E для вывода предварительно обработанного источника в стандартную версию.

gcc -E foo.cpp

Sun Studio также поддерживает этот флаг:

CC -E foo.cpp

Но еще лучше - xdumpmacros. Вы можете найти дополнительную информацию в документах Sun.