2008-09-19 2 views
13

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

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

+0

retagged gcc, основанный на контенте – 2008-09-20 00:24:41

ответ

14

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

1

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

8

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

+0

Upvote для подсказки, но, надо сказать, обработанный файл хуже, чем сам макрос (особенно если макрос охватывает несколько строк). Десятки тысяч строк по какой-то причине, с большим количеством пустых строк, заполняющих большую часть документа. – Samaursa 2011-11-03 17:55:07

5

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

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

+1

Спасибо; хороший совет. Я спрашивал не из-за конкретной ситуации, а потому, что у меня были проблемы в прошлом с этим и ожидалось больше в будущем. Большая часть кода, который я поддерживаю (в основном, не написанная мной), широко использует макросы, поэтому по-прежнему полезно отлаживать их. – Tyler 2008-09-20 01:14:33

2

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

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

0

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

gcc -E foo.cpp 

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

CC -E foo.cpp 

Но еще лучше -xdumpmacros. Более подробную информацию Вы можете найти in Suns' docs.

1

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

Смежные вопросы