Скажімо, у мене є вихідний файл із багатьма директивами препроцесора. Чи можна побачити, як це виглядає після того, як з ним робиться препроцесор?
Скажімо, у мене є вихідний файл із багатьма директивами препроцесора. Чи можна побачити, як це виглядає після того, як з ним робиться препроцесор?
Відповіді:
cl.exe
, інтерфейс командного рядка до Microsoft Visual C ++ має три різні варіанти виведення попередньо обробленого файлу (звідси непослідовність попередніх відповідей про Visual C ++):
/E
: попередня обробка до stdout (подібно до опції -E GCC)/P
: попередня обробка до файлу/EP
: попередня обробка для stdout без директив #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 ++ -> Препроцесор, "Створити попередньо оброблений файл" - це те, що ви шукаєте. Потім клацніть правою кнопкою миші на файлі в Провіднику рішень і виберіть "Компілювати". Попередньо оброблений файл створюється у вихідному каталозі (наприклад, Release, Debug) з розширенням .i (дякує Steed за його коментар).
Release
, Debug
) з розширенням .i
.
Зазвичай потрібно виконати деяку пост-обробку на виході препроцесора, інакше всі макроси просто розширяться до одного вкладиша, що важко читати та налагоджувати. Для коду С достатньо чогось такого:
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
якщо ви використовуєте компілятор C ++ Microsoft.
У Visual Studio ви можете скласти файл (або проект) за допомогою / P.
Як відповіли 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, який містив вихід препроцесора.
CPIP - це новий препроцесор C / C ++, написаний на Python. Якщо ви хочете детальне візуальне зображення попередньо обробленого файлу, дайте йому знімок.
CPIP - це попередній процесор C / C ++, реалізований у Python. Більшість попередніх процесорів розглядають попередню обробку як брудну роботу, яку просто необхідно виконати якнайшвидше. Це може ускладнити відстеження тонких дефектів на етапі попередньої обробки, оскільки попередні процесори викидають багато корисної інформації на користь отримання результату якомога дешевше.
Мало хто з розробників справді розуміє попередню обробку, для багатьох це незрозумілий шматочок чорної магії. CPIP має на меті покращити це і записуючи кожну деталь попередньої обробки, щоб CPIP міг отримати чудо-візуальну інформацію про залежність файлів, використання макрокоманду тощо.
CPIP не розрахований на заміну cpp (або будь-якого іншого встановленого попереднього процесора), натомість CPIP вважає чіткість та розуміння важливішими, ніж швидкість обробки.
В ОС Windows простий відповідь на один рядок на це питання полягає у використанні команди нижче в командному рядку DOS для перегляду попередньо обробленого файлу:
CL /P /C myprogram.c
Це створить файл під назвою myprogram.i . Відкрийте його та зверніть увагу на розширені препроцесори.