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

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

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

gcc с измененными тегами, основанный на содержании

Jay Bazuzi 20.09.2008 04:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
1
2 825
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

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

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

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

Samaursa 03.11.2011 21:55

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

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

Спасибо; хороший совет. Я спрашивал не из-за конкретной ситуации, а потому, что у меня были проблемы с этим в прошлом, и я ожидаю большего в будущем. Большая часть поддерживаемого мной кода (в основном написанного не мной) широко использует макросы, поэтому все еще полезно иметь возможность их отлаживать.

Tyler 20.09.2008 05:14

Я поддержал, но, к сожалению, многим из нас нужна эта информация, потому что нам остается отлаживать макросы, используемые ленивыми, некомпетентными людьми или полагающими, что частое и плодотворное использование макросов является «хорошим дизайном».

weberc2 13.11.2012 21:37

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

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

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

gcc -E foo.cpp

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

CC -E foo.cpp

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

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

Другие вопросы по теме