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

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

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


person Tyler    schedule 19.09.2008    source источник
comment
gcc с измененными тегами на основе контента   -  person Jay Bazuzi    schedule 20.09.2008


Ответы (7)


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

person dvorak    schedule 19.09.2008

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

person Community    schedule 20.09.2008
comment
Проголосуйте за совет, но я должен сказать, что обработанный файл хуже, чем просмотр макросов самостоятельно (особенно если макрос занимает несколько строк). Десятки тысяч строк по какой-то причине, с большим количеством пустых строк, заполняющих большую часть документа. - person Samaursa; 03.11.2011

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

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

person Joe Schneider    schedule 20.09.2008
comment
Спасибо; хороший совет. Я спрашивал не из-за конкретной ситуации, а потому, что у меня были проблемы с этим в прошлом, и я ожидаю большего в будущем. Большая часть кода, который я поддерживаю (в основном написанный не мной), широко использует макросы, поэтому по-прежнему полезно иметь возможность их отлаживать. - person Tyler; 20.09.2008
comment
Я проголосовал, но, к сожалению, многим из нас необходимо знать эту информацию, потому что нам приходится отлаживать макросы, используемые людьми, которые либо ленивы, некомпетентны, либо считают частое и продуктивное использование макросов хорошим дизайном. - person weberc2; 13.11.2012

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

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

person Robert Gould    schedule 20.09.2008

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

person Nemanja Trifunovic    schedule 20.09.2008

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

person archbishop    schedule 20.09.2008

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

gcc -E foo.cpp

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

CC -E foo.cpp

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

person Community    schedule 20.09.2008