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

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

Было бы полезно, если бы вы предоставили дополнительную информацию, например, какой компилятор вы используете.

JaredPar 10.11.2008 10:14

В настоящее время я использую Visual Studio 2005 в качестве IDE.

Geo 10.11.2008 10:16

Тогда по умолчанию вы используете компилятор cl.exe.

Martin York 10.11.2008 18:37

Почему был принят ответ gcc, когда он сказал, что использует VS2005?

Jim Buck 10.11.2008 19:49

Связанный: Информация о компиляторе.

Laurie Stearn 17.01.2020 12:17
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
210
5
95 630
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

Вопрос gcc: stackoverflow.com/questions/3916979/…

Ciro Santilli新疆棉花TRUMP BAN BAD 17.01.2016 14:44

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

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

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

«Предварительная обработка в файл» в VS2010.

Rob W 01.11.2013 13:31

Кстати, файл создается в каталоге вывода (например, Release, Debug) с расширением .i.

Steed 10.01.2014 15:05

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

IanH 06.11.2015 22:45

Обратите внимание, что для меня на MSVC 2015 файл .i находился не в Выходной каталог, а в Промежуточный каталог проекта. Это не то же самое, если вы, например, создавайте свои проекты с помощью CMake.

user1556435 18.12.2017 19:39

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

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

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

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

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

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

Как передать эти команды проекту с помощью nmake и Makefile?

WooDzu 09.03.2014 12:00

@WooDzu Используйте NMAKE (nmake.exe) для автоматизации задач, которые создают проекты Visual C++ с помощью традиционного make-файла. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx

G.Rassovsky 17.03.2015 12:11

Обратите внимание, что /P подавляет создание файлов obj. Поэтому, если вы укажете параметры /P, вы можете получить ссылку на ошибку, в которой говорится, что некоторые файлы obj не могут быть найдены, потому что на самом деле они вообще не создаются.

smwikipedia 09.08.2016 05:16

Убедитесь, что вы находитесь в VS Developer command prompt, а НЕ в Command prompt, когда пытаетесь использовать компилятор MS (cl). Компилятор недоступен в обычном командной строке.

dmytro.poliarush 25.12.2019 14:30

Сообщество VS2019: ошибка / П LNK 1104 все еще актуальна для прессы.

Laurie Stearn 17.01.2020 11:42

Как ответили 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, содержащий выходные данные препроцессора.

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

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

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

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

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

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

sage 03.11.2015 01:48

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

CPIP is a C/C++ pre-processor implemented in Python. Most pre-processors regard pre-processing as a dirty job that just has to be done as soon as possible. This can make it very hard to track down subtle defects at the pre-processing stage as pre-processors throw away a lot of useful information in favor of getting the result as cheaply as possible.

Few developers really understand pre-processing, to many it is an obscure bit of black magic. CPIP aims to improve that and by recording every detail of preprocessing so CPIP can can produce some wonderfully visual information about file dependencies, macro usage and so on.

CPIP is not designed to be a replacement for cpp (or any other established pre-processor), instead CPIP regards clarity and understanding as more important than speed of processing.

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

CL /P /C myprogram.c

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

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