Допустим, у меня есть исходный файл со множеством директив препроцессора. Можно ли увидеть, как это будет выглядеть после того, как препроцессор с ним покончит?
Как мне увидеть исходный файл C / C ++ после предварительной обработки в Visual Studio?
Ответы (10)
cl.exe
, интерфейс командной строки для Microsoft Visual C ++, имеет три различных варианта вывода предварительно обработанного файла (отсюда несогласованность в предыдущих ответах о Visual C ++):
/E
: препроцессировать в стандартный вывод (аналогично параметру GCC -E)/P
: препроцессировать в файл/EP
: предварительная обработка в стандартный вывод без директив #line
Если вы хотите выполнить предварительную обработку файла без директив #line, объедините параметры /P
и /EP
.
/P
подавит создание файлов obj. Поэтому, если вы укажете /P
параметры, вы можете получить ссылку на ошибку, в которой говорится, что некоторые файлы obj не могут быть найдены, потому что на самом деле они вообще не сгенерированы.
- person smwikipedia; 09.08.2016
VS Developer command prompt
, а НЕ в Command prompt
при попытке использовать компилятор MS (cl
). Компилятор недоступен в обычном командной строке.
- person dmytro.poliarush; 25.12.2019
У большинства компиляторов есть возможность просто запустить препроцессор. например, 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, я оставлю это другим авторам, чтобы они могли дать ответы, поскольку я в этом не эксперт.
Щелкните правой кнопкой мыши файл в обозревателе решений и выберите Свойства. В разделе «Свойства конфигурации» -> «C / C ++» -> «Препроцессор» выберите «Создать предварительно обработанный файл». Затем щелкните файл правой кнопкой мыши в обозревателе решений и выберите «Скомпилировать». Предварительно обработанный файл создается в выходном каталоге (например, Release, Debug) с расширением .i (спасибо Steed за его комментарий).
Release
, Debug
) с расширением .i
.
- person Steed; 10.01.2014
Обычно вам нужно выполнить некоторую постобработку вывода препроцессора, иначе все макросы просто расширяются до одних лайнеров, которые трудно читать и отлаживать. Для кода C достаточно следующего:
gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c
Для кода C ++ это на самом деле намного сложнее. Для GCC / g ++ я нашел этот скрипт Perl полезным.
Я ничего не знаю о компиляторе Microsoft, но в GCC вы можете использовать это:
gcc -E -P -o result.c my_file.h
Если вы хотите видеть комментарии, используйте это:
gcc -E -C -P -o result.c my_file.h
Дополнительные параметры доступны на этой странице.
Попробуйте cl /EP
, если вы используете компилятор Microsoft C ++.
В Visual Studio вы можете скомпилировать файл (или проект) с помощью / P.
Как ответили 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, содержащий выходные данные препроцессора.
CPIP - это новый препроцессор C / C ++, написанный на Python. Если вам нужно подробное визуальное представление предварительно обработанного файла, попробуйте.
CPIP - это препроцессор C / C ++, реализованный на Python. Большинство препроцессоров рассматривают предварительную обработку как грязную работу, которую нужно выполнить как можно скорее. Это может затруднить отслеживание мелких дефектов на этапе предварительной обработки, поскольку препроцессоры выбрасывают много полезной информации в пользу получения результата как можно дешевле.
Немногие разработчики действительно понимают предварительную обработку, для многих это непонятная часть черной магии. CPIP стремится улучшить это и записывает каждую деталь предварительной обработки, чтобы CPIP мог выдавать чудесную визуальную информацию о зависимостях файлов, использовании макросов и так далее.
CPIP не предназначен для замены cpp (или любого другого установленного препроцессора), вместо этого CPIP считает ясность и понимание более важными, чем скорость обработки.
В ОС Windows простой однострочный ответ на этот вопрос - использовать следующую команду в приглашении DOS, чтобы увидеть предварительно обработанный файл:
CL /P /C myprogram.c
Будет создан файл с именем myprogram.i. Откройте его и обратите внимание на свои расширенные препроцессоры.