Как увидеть исходный файл C / C ++ после предварительной обработки в Visual Studio? - PullRequest
199 голосов
/ 10 ноября 2008

Допустим, у меня есть исходный файл со многими директивами препроцессора. Можно ли посмотреть, как он выглядит после того, как препроцессор с ним покончил?

Ответы [ 10 ]

144 голосов
/ 10 ноября 2008

cl.exe, интерфейс командной строки для Microsoft Visual C ++, имеет три различных варианта вывода предварительно обработанного файла (отсюда и несоответствие в предыдущих ответах о Visual C ++):

Если вы хотите предварительно обработать файл без директив #line, объедините опции /P и /EP.

118 голосов
/ 10 ноября 2008

Большинство компиляторов имеют возможность просто запустить препроцессор. например, , gcc предоставляет -E:

   -E  Stop after the preprocessing stage; do not run the compiler proper.  
       The output is in the form of preprocessed source code, which is sent
       to the standard output.

Так что вы можете просто запустить:

gcc -E foo.c

Если вы не можете найти такую ​​опцию, вы также можете просто найти препроцессор C на вашем компьютере. Обычно он называется cpp и, вероятно, уже на вашем пути. Вызовите это так:

cpp foo.c

Если есть заголовки, которые нужно включить из других каталогов, вы можете передать -I / path / to / include / dir в любой из них, так же, как вы это делаете с обычной компиляцией.

Для Windows я оставлю это другим постерам, чтобы они давали ответы, так как я там не эксперт.

94 голосов
/ 10 ноября 2008

Щелкните правой кнопкой мыши файл в обозревателе решений, перейдите в Свойства. В Свойствах конфигурации-> C / C ++ -> Препроцессор, «Создать предварительно обработанный файл» - это то, что вы ищете. Затем щелкните правой кнопкой мыши файл в обозревателе решений и выберите «Компилировать». Предварительно обработанный файл создается в выходном каталоге (например, Release, Debug) с расширением .i (спасибо Steed за его комментарий).

18 голосов
/ 10 ноября 2008

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

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c

Для кода C ++ это на самом деле намного сложнее. Для GCC / g ++ я нашел этот скрипт на Perl полезным.

8 голосов
/ 07 марта 2013

Я ничего не знаю о компиляторе Microsoft, но в GCC вы можете использовать это:

gcc -E -P -o result.c my_file.h

Если вы хотите видеть комментарии, используйте это:

gcc -E -C -P -o result.c my_file.h

Дополнительные параметры доступны на этой странице .

8 голосов
/ 10 ноября 2008

Попробуйте cl /EP, если вы используете компилятор Microsoft C ++.

6 голосов
/ 10 ноября 2008

В Visual Studio вы можете скомпилировать файл (или проект) с /P.

5 голосов
/ 24 января 2013

Как ответили bk1e и Andreas M., опция / P для компилятора заставит его предварительно обработать файл. Однако в моем проекте, использующем VS2005 и Platform Builder (для встроенного процессора ARM), проект не предоставлял параметр в диалоговом окне (как описано Jim B), чтобы включить этот параметр.

Я мог запустить CL вручную и добавить / P, но это не удалось, потому что я не знал всех соответствующих параметров командной строки, которые незаметно активировались Platform Builder во время полной сборки. Поэтому мне нужно было знать все эти варианты.

Мое решение состояло в том, чтобы пойти посмотреть в файл build.log и найти строку, которая выполнила

CL blah-blah-blah myfile.c

Я скопировал эту строку в буфер обмена. Часть "бла-бла-бла" содержала параметры сборки и была огромной.

Вернувшись в IDE, я щелкнул правой кнопкой мыши на myfile.c, выбрал «Открыть окно сборки», а затем в этом окне вставил командную строку сборки и добавил «/P".

».

CL /P blah-blah-blah myfile.c

Готово. Был создан файл myfile.i, который содержал выходные данные препроцессора.

2 голосов
/ 31 января 2015

В ОС Windows простой однострочный ответ на этот вопрос заключается в использовании приведенной ниже команды в командной строке DOS для просмотра предварительно обработанного файла:

CL /P /C myprogram.c

Это создаст файл с именем myprogram.i . Откройте его и обратите внимание на расширенные препроцессоры.

2 голосов
/ 04 октября 2014

CPIP - это новый препроцессор C / C ++, написанный на Python. Если вам нужно подробное визуальное представление предварительно обработанного файла, попробуйте.

CPIP - это препроцессор C / C ++, реализованный на Python. Большинство препроцессоров считают предварительную обработку грязной работой, которую нужно сделать как можно скорее. Это может усложнить отслеживание мелких дефектов на этапе предварительной обработки, так как препроцессоры выбрасывают много полезной информации в пользу получения результата как можно дешевле.

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

CPIP не предназначен для замены cpp (или любого другого установленного препроцессора), вместо этого CPIP считает ясность и понимание важнее скорости обработки.

...