Расширение макросов для отладки?

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

В VS2017 я пробовал Processor> C/C++> Preprocessor> Preprocess для файла, который создает файл *.i, но его длина составляет около 50 тысяч строк, и я не могу найти, где был расширен мой макрос.

редактировать: я знаю, что макросы - это плохие новости, однако кодовая база, в которую я вхожу, использует их совсем немного, поэтому я пытаюсь лучше их понять.


person Joe    schedule 04.05.2018    source источник
comment
Если вы расширите макросы, вы получите много кода для просмотра — одна из многих причин, по которым вам не следует использовать макросы, по крайней мере, в C++.   -  person    schedule 04.05.2018
comment
Понятно - к сожалению, кодовая база, в которую я вошел, использует их, поэтому я пытаюсь понять, как их понять.   -  person Joe    schedule 04.05.2018
comment
Если вы используете IDE как eclipse, вы можете просто навести указатель мыши на макрос, и он раскроется во всплывающем окне.   -  person Galik    schedule 04.05.2018
comment
Я использую VS2017, когда я наводил курсор на макрос, он просто говорил мне, что я вижу.   -  person Joe    schedule 04.05.2018
comment
Добавление к комментарию @Galik - вы можете увидеть расширения шаг за шагом, а затем понять порядок.   -  person SHG    schedule 04.05.2018
comment
Некоторые компиляторы имеют переключатель командной строки, который позволяет выгружать предварительно обработанные исходные файлы. Проверьте параметры вашего компилятора.   -  person Thomas Matthews    schedule 04.05.2018
comment
Вариант создания этого файла .i, вероятно, лучший из возможных. Но: поиск — ваш друг! Прочтите файл в хорошем текстовом редакторе и найдите некоторые ключевые слова или вызовы функций, которые, как вы знаете, находятся рядом с интересующим вас расширением макроса, и вы сможете его найти.   -  person Steve Summit    schedule 04.05.2018
comment
@ThomasMatthews Они уже пробовали это, но это около 50 тысяч строк, и я не могу найти, куда был расширен мой макрос.   -  person Baum mit Augen    schedule 04.05.2018
comment
Я новичок в использовании макрофункций - тогда узнайте это прямо сейчас: не используйте макросы вообще (за исключением очень немногих ситуаций, когда они действительно/к сожалению, являются единственным вариантом).   -  person Jesper Juhl    schedule 04.05.2018
comment
@Steve Summit - Конечно. Я просто дал общий совет. И даже унаследованные макросы во многих случаях могут быть переписаны как правильные функции ;-)   -  person Jesper Juhl    schedule 04.05.2018
comment
@Steve Summit В моей книге тупой == хороший. Я просто пытался сформулировать пункт не использовать макросы.   -  person Jesper Juhl    schedule 04.05.2018


Ответы (1)


В VS2017 я пробовал Processor> C/C++> Preprocessor> Preprocess для файла, который создает файл *.i, но он имеет длину около 50 тыс. строк, и я не могу найти, где был расширен мой макрос.

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

E.g.

extern int dummyIntVariable;
MY_COMPLICATED_MACRO(arg1, arg2);

После этого вы ищете dummyIntVariable в файле .i. Строка ниже будет содержать то, до чего расширяется MY_COMPLICATED_MACRO.

Или, как указал @Sneftel в комментарии, вы можете использовать любую старую строку, которая поможет вам перемещаться по файлу .i.

THIS IS A UNIQUE STRING
MY_COMPLICATED_MACRO(arg1, arg2);

Поскольку файл будет только предварительно обработан, это также должно работать.

person R Sahu    schedule 04.05.2018
comment
Если вы выполняете только предварительную обработку, вам даже не нужно объявлять фиктивную переменную. - person Sneftel; 04.05.2018
comment
@Sneftel, фиктивная переменная полезна для навигации по 50 тысячам строк, которые OP видит в файле .i. - person R Sahu; 04.05.2018
comment
Нет, я имею в виду, что код не нужно компилировать, только предварительно обработать. Вы можете просто ввести THIS IS A UNIQUE STRING и выполнить grep для этого. - person Sneftel; 04.05.2018
comment
@Sneftel, понятно. Да это тоже вариант. - person R Sahu; 04.05.2018