Как увидеть исходный файл C / C ++ после предварительной обработки в Visual Studio?

206

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

Geo
источник
Было бы полезно, если бы вы предоставили больше информации, например, какой компилятор вы используете.
JaredPar
В настоящее время я использую Visual Studio 2005 в качестве моей IDE.
Geo
Тогда по умолчанию вы используете компилятор cl.exe.
Мартин Йорк,
3
Почему ответ gcc был принят, когда он сказал, что использует VS2005?
Джим Бак
Связанный: Информация компилятора .
Лори Стерн

Ответы:

147

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

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

bk1e
источник
1
Как передать эти команды в проект с помощью nmake и Makefile?
WooDzu
@WooDzu Используйте NMAKE (nmake.exe) для автоматизации задач, которые создают проекты Visual C ++ с использованием традиционного make-файла. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
Г.Рассовский
8
Обратите внимание, что /Pбудет подавлять генерацию файлов obj. Поэтому, если вы добавите /Pпараметры, вы можете получить ссылку, сообщающую, что некоторые файлы obj не могут быть найдены, потому что они вообще не генерируются.
smwikipedia
Убедитесь, что вы в, VS Developer command promptа не в Command promptпри попытке использовать компилятор MS ( cl). Компилятор недоступен в обычной командной строке.
dmytro.poliarush
Сообщество VS2019: ошибка / P LNK 1104 по-прежнему остается горячей.
Лори Стерн
119

Большинство компиляторов имеют возможность просто запустить препроцессор. например , 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 я оставлю это другим постерам, чтобы дать ответы, поскольку я не эксперт там.

Тодд Гамблин
источник
2
gcc вопрос: stackoverflow.com/questions/3916979/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
100

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

Джим Бак
источник
9
«Предварительная обработка в файл» в VS2010.
Роб W
18
Кстати, файл создается в выходном каталоге (например Release, Debug) с расширением .i.
Конь
1
Это очень помогает, поскольку использует конфигурацию сборки, уже настроенную в проекте, чтобы найти все нужные заголовки.
Янв
Обратите внимание, что для меня на MSVC 2015 файл .i находился не в выходном каталоге , а в промежуточном каталоге проекта . Это не то же самое, если вы, например, генерируете свои проекты с использованием CMake.
user1556435
19

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

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

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

ididak
источник
8

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

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

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

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

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

dzav
источник
1
Это также работает с компиляторами, производными от gcc, такими как qcc.exe - спасибо!
мудрец
8

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

Atempcode
источник
6

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

Андреас Магнуссон
источник
5

Как ответили 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

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

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

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

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

thegreendroid
источник
2

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

CL /P /C myprogram.c

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

манты
источник