Допустим, у меня есть исходный файл со многими директивами препроцессора. Можно ли посмотреть, как это выглядит после того, как препроцессор закончил с ним?
Допустим, у меня есть исходный файл со многими директивами препроцессора. Можно ли посмотреть, как это выглядит после того, как препроцессор закончил с ним?
Ответы:
cl.exe
интерфейс командной строки для Microsoft Visual C ++ имеет три различных варианта вывода предварительно обработанного файла (отсюда и несоответствие в предыдущих ответах о Visual C ++):
/E
: preprocess to stdout (аналогично опции -E в GCC)/P
: предварительная обработка в файл/EP
: препроцесс в стандартный вывод без директив #lineЕсли вы хотите предварительно обработать файл без директив #line, объедините параметры /P
и /EP
.
/P
будет подавлять генерацию файлов obj. Поэтому, если вы добавите /P
параметры, вы можете получить ссылку, сообщающую, что некоторые файлы obj не могут быть найдены, потому что они вообще не генерируются.
VS Developer command prompt
а не в Command prompt
при попытке использовать компилятор MS ( cl
). Компилятор недоступен в обычной командной строке.
Большинство компиляторов имеют возможность просто запустить препроцессор. например , 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 ++ -> Preprocessor, «Создать предварительно обработанный файл» - это то, что вы ищете. Затем щелкните правой кнопкой мыши файл в обозревателе решений и выберите «Компилировать». Предварительно обработанный файл создается в выходном каталоге (например, Release, Debug) с расширением .i (спасибо Steed за его комментарий).
Release
, Debug
) с расширением .i
.
Как правило, вам нужно выполнить некоторую постобработку на выходе препроцессора, иначе все макросы просто расширяются до одних строк, которые трудно читать и отлаживать. Для кода на 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
Дополнительные опции доступны на этой странице .
В Visual Studio вы можете скомпилировать файл (или проект) с помощью / P.
Как ответили 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, который содержал выходные данные препроцессора.
CPIP - это новый препроцессор C / C ++, написанный на Python. Если вы хотите детальное визуальное представление предварительно обработанного файла, сделайте это.
CPIP - это препроцессор C / C ++, реализованный на Python. Большинство препроцессоров рассматривают предварительную обработку как грязную работу, которую нужно сделать как можно скорее. Это может усложнить отслеживание тонких дефектов на этапе предварительной обработки, поскольку препроцессоры выбрасывают много полезной информации в пользу получения результата как можно дешевле.
Немногие разработчики действительно понимают предварительную обработку, для многих это неясная часть черной магии. CPIP стремится улучшить это и записывать каждую деталь предварительной обработки, чтобы CPIP мог создавать удивительную визуальную информацию о зависимостях файлов, использовании макросов и так далее.
CPIP не предназначен для замены cpp (или любого другого установленного препроцессора), вместо этого CPIP считает ясность и понимание важнее скорости обработки.
В ОС Windows простой однострочный ответ на этот вопрос заключается в использовании приведенной ниже команды в командной строке DOS для просмотра предварительно обработанного файла:
CL /P /C myprogram.c
Это создаст файл с именем myprogram.i . Откройте его и обратите внимание на расширенные препроцессоры.