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

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


person Geo    schedule 10.11.2008    source источник
comment
Было бы полезно, если бы вы предоставили дополнительную информацию, например, какой компилятор вы используете.   -  person JaredPar    schedule 10.11.2008
comment
В настоящее время я использую Visual Studio 2005 в качестве IDE.   -  person Geo    schedule 10.11.2008
comment
Тогда по умолчанию вы используете компилятор cl.exe.   -  person Martin York    schedule 10.11.2008
comment
Почему был принят ответ gcc, когда он сказал, что использует VS2005?   -  person Jim Buck    schedule 10.11.2008
comment
Связано: Информация о компиляторе.   -  person Laurie Stearn    schedule 17.01.2020


Ответы (10)


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

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

person bk1e    schedule 10.11.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, я оставлю это другим авторам, чтобы они могли дать ответы, поскольку я в этом не эксперт.

person Todd Gamblin    schedule 10.11.2008
comment
Вопрос gcc: stackoverflow.com/questions/3916979/ - person Ciro Santilli 新疆再教育营六四事件ۍ 17.01.2016

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

person Jim Buck    schedule 10.11.2008
comment
Предварительная обработка файла в VS2010. - person Rob W; 01.11.2013
comment
Кстати, файл создается в каталоге вывода (например, Release, Debug) с расширением .i. - person Steed; 10.01.2014
comment
Это очень помогает, поскольку использует уже настроенную в проекте конфигурацию сборки для поиска всех нужных заголовков. - person IanH; 06.11.2015
comment
Обратите внимание, что для меня на MSVC 2015 файл .i находился не в Выходном каталоге, а в Промежуточном каталоге проекта. Это не то же самое, если вы, например, создавайте свои проекты с помощью CMake. - person user1556435; 18.12.2017

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

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

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

person ididak    schedule 10.11.2008

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

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

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

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

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

person dzav    schedule 06.03.2013
comment
Это также работает с компиляторами, производными от gcc, такими как qcc.exe - спасибо! - person sage; 03.11.2015

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

person Atempcode    schedule 10.11.2008

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

person Andreas Magnusson    schedule 10.11.2008

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

Я мог запустить 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, содержащий выходные данные препроцессора.

person Sam Pittman    schedule 24.01.2013

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

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

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

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

person thegreendroid    schedule 04.10.2014

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

CL /P /C myprogram.c

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

person manty    schedule 31.01.2015