Bagaimana saya melihat file sumber C / C ++ setelah preprocessing di Visual Studio?

206

Katakanlah saya memiliki file sumber dengan banyak arahan preprocessor. Apakah mungkin untuk melihat tampilannya setelah preprosesor selesai?

Geo
sumber
Ini akan membantu jika Anda memberikan lebih banyak informasi seperti kompiler yang Anda gunakan.
JaredPar
Saat ini saya menggunakan Visual Studio 2005 sebagai IDE saya.
Geo
Kemudian secara default Anda menggunakan kompiler cl.exe.
Martin York
3
Mengapa jawaban gcc diterima ketika ia mengatakan ia menggunakan VS2005?
Jim Buck
Terkait: Info kompiler .
Laurie Stearn

Jawaban:

147

cl.exe, antarmuka baris perintah ke Microsoft Visual C ++, memiliki tiga opsi berbeda untuk menghasilkan file yang telah diproses (karenanya inkonsistensi dalam respons sebelumnya tentang Visual C ++):

Jika Anda ingin memproses ulang file tanpa arahan #line, gabungkan opsi /Pdan /EP.

bk1e
sumber
1
Bagaimana saya meneruskan perintah ini ke proyek dengan nmake dan Makefile?
WooDzu
@WooDzu Gunakan NMAKE (nmake.exe) untuk mengotomatisasi tugas-tugas yang membangun proyek Visual C ++ dengan menggunakan makefile tradisional. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky
8
Harap dicatat bahwa /Pakan menekan pembuatan file obj. Jadi, jika Anda meletakkan /Popsi, Anda mungkin mendapatkan tautan kesalahan yang mengatakan beberapa file obj tidak dapat ditemukan karena sebenarnya tidak dihasilkan sama sekali.
smwikipedia
Pastikan Anda masuk VS Developer command promptdan TIDAK masuk Command promptsaat mencoba menggunakan kompiler MS ( cl). Kompiler tidak tersedia dalam prompt perintah konvensional.
dmytro.poliarush
VS2019 Community: Kesalahan / P LNK 1104 masih panas dari pers.
Laurie Stearn
119

Sebagian besar kompiler memiliki opsi untuk hanya menjalankan preprocessor. misalnya , gcc menyediakan -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.

Jadi Anda bisa menjalankan:

gcc -E foo.c

Jika Anda tidak dapat menemukan opsi seperti itu, Anda juga dapat menemukan preprosesor C pada mesin Anda. Biasanya disebut cpp dan mungkin sudah ada di jalur Anda. Aktifkan seperti ini:

cpp foo.c

Jika ada tajuk yang perlu Anda sertakan dari direktori lain, Anda bisa meneruskan -I / path / ke / menyertakan / dir ke salah satu dari ini, sama seperti yang Anda lakukan dengan kompilasi biasa.

Untuk Windows, saya akan menyerahkannya ke poster lain untuk memberikan jawaban karena saya bukan ahli di sana.

Todd Gamblin
sumber
2
pertanyaan gcc: stackoverflow.com/questions/3916979/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件
100

Klik kanan pada file pada Solution Explorer, goto Properties. Di bawah Configuration Properties-> C / C ++ -> Preprocessor, "Generate Preprocessed File" adalah apa yang Anda cari. Kemudian klik kanan pada file di Solution Explorer dan pilih "Kompilasi". File yang sudah diproses dibuat di direktori output (mis. Release, Debug) dengan ekstensi .i (terima kasih kepada Steed untuk komentarnya).

Jim Buck
sumber
9
"Preprocess to a File" di VS2010.
Rob W
18
BTW, file dibuat di direktori output (misalnya Release, Debug) dengan ekstensi .i.
Steed
1
Ini sangat membantu karena menggunakan konfigurasi build yang sudah diatur dalam proyek untuk menemukan semua header yang tepat.
IanH
Catatan, bagi saya di MSVC 2015, file .i tidak ada dalam Direktori Output , tetapi di Direktori Intermediate proyek . Ini tidak sama jika Anda misalnya menghasilkan proyek Anda menggunakan CMake.
user1556435
19

Anda biasanya perlu melakukan beberapa postprocessing pada output preprocessor, jika tidak semua makro hanya memperluas ke satu liners, yang sulit dibaca dan debug. Untuk kode C, sesuatu seperti yang berikut sudah cukup:

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

Untuk kode C ++, sebenarnya jauh lebih sulit. Untuk GCC / g ++, saya menemukan skrip Perl ini berguna.

ididak
sumber
8

Saya tidak tahu apa-apa tentang kompiler Microsoft, tetapi pada GCC Anda dapat menggunakan ini:

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

Jika Anda ingin melihat komentar, gunakan ini:

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

Opsi lainnya tersedia di halaman ini .

dzav
sumber
1
Ini juga bekerja dengan kompiler yang diturunkan gcc, seperti qcc.exe - terima kasih!
bijak
8

Coba cl /EPjika Anda menggunakan kompiler C ++ Microsoft.

Atempcode
sumber
6

Di Visual Studio Anda dapat mengkompilasi file (atau proyek) dengan / P.

Andreas Magnusson
sumber
5

Ketika bk1e dan Andreas M. menjawab, opsi / P untuk kompiler akan membuatnya memproses file. Namun, dalam proyek saya menggunakan VS2005 dan Platform Builder (untuk prosesor ARM tertanam), proyek tidak menyajikan opsi di kotak dialog (seperti yang dijelaskan oleh Jim B) untuk mengaktifkan opsi itu.

Saya bisa menjalankan CL secara manual dan menambahkan / P, tetapi gagal karena saya tidak tahu semua opsi baris perintah yang tepat yang secara kasat mata sedang diaktifkan oleh Platform Builder selama pembangunan penuh. Jadi saya perlu tahu semua opsi itu.

Solusi saya adalah mencari di file build.log, dan temukan baris yang dieksekusi

CL blah-blah-blah myfile.c

Saya menyalin baris ini ke clipboard. Bagian "bla-bla-bla" berisi opsi build, dan sangat besar.

Kembali ke IDE, saya mengklik kanan myfile.c, memilih "Open Build Window", dan kemudian di jendela itu saya menempelkan baris perintah build, dan menambahkan "/ P".

CL /P blah-blah-blah myfile.c

Selesai File myfile.i diproduksi, yang berisi output preprocessor.

Sam Pittman
sumber
2

CPIP adalah preprocessor C / C ++ baru yang ditulis dengan Python. Jika Anda ingin representasi visual terperinci dari file yang telah diproses, cobalah.

CPIP adalah pra-prosesor C / C ++ yang diimplementasikan dengan Python. Sebagian besar pra-prosesor menganggap pra-pemrosesan sebagai pekerjaan kotor yang harus dilakukan sesegera mungkin. Ini dapat membuatnya sangat sulit untuk melacak cacat halus pada tahap pra-pemrosesan karena pra-prosesor membuang banyak informasi yang berguna demi mendapatkan hasil semurah mungkin.

Beberapa pengembang benar-benar mengerti pra-pemrosesan, bagi banyak orang itu adalah sedikit ilmu hitam yang tidak jelas. CPIP bertujuan untuk meningkatkan itu dan dengan merekam setiap detail preprocessing sehingga CPIP dapat dapat menghasilkan beberapa informasi visual yang luar biasa tentang dependensi file, penggunaan makro dan sebagainya.

CPIP tidak dirancang untuk menjadi pengganti cpp (atau pra-prosesor yang sudah ada lainnya), melainkan CPIP menganggap kejelasan dan pemahaman lebih penting daripada kecepatan pemrosesan.

thegreendroid
sumber
2

Pada OS Windows, jawaban satu baris sederhana untuk pertanyaan ini adalah dengan menggunakan perintah di bawah ini di DOS prompt untuk melihat file yang sudah diproses:

CL /P /C myprogram.c

Ini akan menghasilkan file bernama myprogram.i . Buka dan lihat preprosesor Anda yang diperluas.

manty
sumber