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





У большинства компиляторов есть возможность просто запустить препроцессор. например, 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/…
В Visual Studio вы можете скомпилировать файл (или проект) с помощью / P.
Попробуйте cl /EP, если вы используете компилятор Microsoft C++.
Щелкните правой кнопкой мыши файл в обозревателе решений и выберите Свойства. В разделе «Свойства конфигурации» -> «C / C++» -> «Препроцессор» выберите «Создать предварительно обработанный файл». Затем щелкните файл правой кнопкой мыши в обозревателе решений и выберите «Скомпилировать». Предварительно обработанный файл создается в выходном каталоге (например, Release, Debug) с расширением .i (спасибо Steed за его комментарий).
«Предварительная обработка в файл» в VS2010.
Кстати, файл создается в каталоге вывода (например, Release, Debug) с расширением .i.
Это очень помогает, поскольку использует уже настроенную в проекте конфигурацию сборки для поиска всех нужных заголовков.
Обратите внимание, что для меня на MSVC 2015 файл .i находился не в Выходной каталог, а в Промежуточный каталог проекта. Это не то же самое, если вы, например, создавайте свои проекты с помощью CMake.
Обычно вам нужно выполнить некоторую постобработку вывода препроцессора, в противном случае все макросы просто расширяются до одного лайнера, который трудно читать и отлаживать. Для кода C достаточно следующего:
gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c
Для кода C++ это на самом деле намного сложнее. Для GCC / g ++ я нашел полезным этот сценарий Perl.
cl.exe, интерфейс командной строки для Microsoft Visual C++, имеет три различных варианта вывода предварительно обработанного файла (отсюда несогласованность в предыдущих ответах о Visual C++):
/E: предварительная обработка в стандартный вывод (аналогично опции -E в GCC)/P: предварительная обработка в файл/EP: предварительная обработка в стандартный вывод без директив #lineЕсли вы хотите выполнить предварительную обработку файла без директив #line, объедините параметры /P и /EP.
Как передать эти команды проекту с помощью nmake и Makefile?
@WooDzu Используйте NMAKE (nmake.exe) для автоматизации задач, которые создают проекты Visual C++ с помощью традиционного make-файла. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
Обратите внимание, что /P подавляет создание файлов obj. Поэтому, если вы укажете параметры /P, вы можете получить ссылку на ошибку, в которой говорится, что некоторые файлы obj не могут быть найдены, потому что на самом деле они вообще не создаются.
Убедитесь, что вы находитесь в VS Developer command prompt, а НЕ в Command prompt, когда пытаетесь использовать компилятор MS (cl). Компилятор недоступен в обычном командной строке.
Сообщество VS2019: ошибка / П LNK 1104 все еще актуальна для прессы.
Как ответили 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 - спасибо!
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. Откройте его и обратите внимание на свои расширенные препроцессоры.
Было бы полезно, если бы вы предоставили дополнительную информацию, например, какой компилятор вы используете.