Як я бачу вихідний файл C / C ++ після попередньої обробки у Visual Studio?


206

Скажімо, у мене є вихідний файл із багатьма директивами препроцесора. Чи можна побачити, як це виглядає після того, як з ним робиться препроцесор?


Це допоможе, якщо ви надали більше інформації, наприклад, який компілятор ви використовуєте.
JaredPar

В даний час я використовую Visual Studio 2005 як свій IDE.
Гео

Тоді за замовчуванням ви використовуєте компілятор cl.exe.
Мартін Йорк

3
Чому було прийнято відповідь gcc, коли він сказав, що використовує VS2005?
Джим Бак

Відповіді:


147

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

Якщо ви хочете попередньо обробити файл без директив #line, поєднайте параметри /Pта /EP.


1
Як передати ці команди проекту nmake та Makefile?
WooDzu

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

8
Зверніть увагу, що /Pпригнічуватиме генерацію файлів obj. Отже, якщо розмістити /Pпараметри, ви можете отримати помилку в посиланні, що деякі obj-файли неможливо знайти, оскільки вони насправді не генеруються взагалі.
smwikipedia

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

VS2019 Спільнота: Помилка / P LNK 1104 все ще залишається гарячою.
Лорі Стерн

119

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



100

Клацніть правою кнопкою миші файл на Провіднику рішень, перейдіть до Властивості. У розділі Властивості конфігурації-> C / C ++ -> Препроцесор, "Створити попередньо оброблений файл" - це те, що ви шукаєте. Потім клацніть правою кнопкою миші на файлі в Провіднику рішень і виберіть "Компілювати". Попередньо оброблений файл створюється у вихідному каталозі (наприклад, Release, Debug) з розширенням .i (дякує Steed за його коментар).


9
"Попередній процес до файлу" у VS2010.
Роб Ш

18
До речі, файл створюється у каталозі виводу (наприклад Release, Debug) з розширенням .i.
Steed

1
Це дуже допомагає, оскільки використовує конфігурацію збірки, вже створену в проекті, щоб знайти всі потрібні заголовки.
Ян Ян

Зауважте, що для мене в MSVC 2015 файл .i знаходився не в каталозі вихідних даних , а в проміжному каталозі проекту . Це не те саме, якщо ви, наприклад, генеруєте свої проекти за допомогою CMake.
користувач1556435

19

Зазвичай потрібно виконати деяку пост-обробку на виході препроцесора, інакше всі макроси просто розширяться до одного вкладиша, що важко читати та налагоджувати. Для коду С достатньо чогось такого:

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

Що стосується коду C ++, це насправді набагато складніше. Для GCC / g ++ я вважаю цей скрипт Perl корисним.


8

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

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

Якщо ви хочете побачити коментарі, використовуйте це:

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

На цій сторінці доступні інші варіанти .


1
Це також працює з компіляторами, отриманими з gcc, такими як qcc.exe - дякую!
шавлія



5

Як відповіли bk1e та Andreas M., опція / 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, який містив вихід препроцесора.


2

CPIP - це новий препроцесор C / C ++, написаний на Python. Якщо ви хочете детальне візуальне зображення попередньо обробленого файлу, дайте йому знімок.

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

Мало хто з розробників справді розуміє попередню обробку, для багатьох це незрозумілий шматочок чорної магії. CPIP має на меті покращити це і записуючи кожну деталь попередньої обробки, щоб CPIP міг отримати чудо-візуальну інформацію про залежність файлів, використання макрокоманду тощо.

CPIP не розрахований на заміну cpp (або будь-якого іншого встановленого попереднього процесора), натомість CPIP вважає чіткість та розуміння важливішими, ніж швидкість обробки.


2

В ОС Windows простий відповідь на один рядок на це питання полягає у використанні команди нижче в командному рядку DOS для перегляду попередньо обробленого файлу:

CL /P /C myprogram.c

Це створить файл під назвою myprogram.i . Відкрийте його та зверніть увагу на розширені препроцесори.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.