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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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

Ответ 7

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

Ответ 8

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

Я мог запустить CL вручную и добавить /P, но это не удалось, потому что я не знал всех подходящих параметров командной строки, которые невидимо активировались Platform Builder во время полной сборки. Поэтому мне нужно было знать все эти варианты.

Мое решение состояло в том, чтобы посмотреть в файле build.log и найти строку, которая выполнила

CL blah-blah-blah myfile.c

Я скопировал эту строку в буфер обмена. Часть "бла-бла-бла" содержала варианты сборки и была огромной.

Вернувшись в среду IDE, я щелкнул правой кнопкой мыши по файлу myfile.c, выбрал "Open Build Window", а затем в этом окне я вставил строку сборки и добавил "/P".

CL /P blah-blah-blah myfile.c

Готово. Был создан файл myfile.i, содержащий вывод препроцессора.

Ответ 9

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

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

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

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

Ответ 10

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

CL /P /C myprogram.c

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