Saya menggunakan pustaka sumber terbuka yang tampaknya memiliki banyak arahan praproses untuk mendukung banyak bahasa selain C. Agar saya dapat mempelajari apa yang dilakukan pustaka tersebut, saya ingin melihat kode C yang saya kompilasi setelah praproses , lebih seperti yang saya tulis.
Dapatkah gcc (atau alat lain yang umumnya tersedia di Linux) membaca pustaka ini tetapi mengeluarkan kode C yang memiliki pra-pemrosesan diubah menjadi apa pun dan juga dapat dibaca oleh manusia?
gcc -E
lebih berguna daripada harus menulis ulang baris untuk membuatnya berfungsicpp
.Jawaban:
Iya. Berikan
-E
opsi gcc . Ini akan mengeluarkan kode sumber yang telah diproses sebelumnya.sumber
-o something.o
Anda mungkin juga ingin mengubahnya menjadi-o something.i
. Jika tidak, keluaran yang telah diproses sebelumnya akan ada dalam.o
file.gcc -E file1.c file2.c ...
cpp
adalah preprocessor.Jalankan
cpp filename.c
untuk mengeluarkan kode yang telah diproses sebelumnya, atau lebih baik, alihkan ke file dengancpp filename.c > filename.preprocessed
.sumber
diff
ternyata tidak ada perbedaan dalam file. Ini juga terlihat seperti cara yang berguna untuk memproses kode yang mencari kesalahan di makro Anda. Pertanyaan bagus dan jawaban bagus (IALCTHW).Saya menggunakan gcc sebagai preprocessor (untuk file html.) Ia melakukan apa yang Anda inginkan. Ini memperluas arahan "# -", kemudian mengeluarkan file yang dapat dibaca. (TIDAK ADA preprosesor C / HTML lain yang pernah saya coba melakukan ini- mereka menggabungkan baris, mencekik karakter khusus, dll.) Dengan asumsi Anda telah menginstal gcc, baris perintahnya adalah:
gcc -E -xc -P -C -traditional-cpp code_before.cpp> code_after.cpp
(Tidak harus 'cpp'.) Ada penjelasan yang sangat bagus tentang penggunaan ini di http://www.cs.tut.fi/~jkorpela/html/cpre.html .
"-Traditional-cpp" mempertahankan spasi & tab.
sumber
-save-temps
Ini adalah opsi bagus lainnya untuk diingat:
main.c
dan sekarang, selain keluaran normal
main.o
, direktori kerja saat ini juga berisi file berikut:main.i
adalah file prepossessed yang diinginkan yang berisi:main.s
adalah bonus :-) dan berisi rakitan yang dihasilkan:Jika Anda ingin melakukannya untuk file dalam jumlah besar, pertimbangkan untuk menggunakan:
yang menyimpan file perantara ke direktori yang sama dengan
-o
output objek alih-alih direktori kerja saat ini, sehingga menghindari potensi konflik nama dasar.Keuntungan dari opsi
-E
ini adalah mudah untuk menambahkannya ke skrip build apa pun, tanpa banyak mengganggu build itu sendiri.Hal keren lainnya tentang opsi ini adalah jika Anda menambahkan
-v
:itu benar-benar menunjukkan file eksplisit yang digunakan dan bukan sementara yang jelek di bawah
/tmp
, jadi mudah untuk mengetahui dengan tepat apa yang sedang terjadi, yang mencakup langkah-langkah preprocessing / kompilasi / perakitan:Diuji di Ubuntu 19.04 amd64, GCC 8.3.0.
sumber
Lari:
atau
sumber
Misalkan kita memiliki file sebagai Message.cpp atau file .c
Langkah 1: Preprocessing (Argument -E)
g ++ -E. \ Message.cpp> P1
File P1 yang dihasilkan memiliki makro yang diperluas dan konten file header dan komentar dihilangkan.
Langkah 2: Terjemahkan file Preprocessed ke assembly (Argument -S). Tugas ini dilakukan oleh compiler
g ++ -S. \ Message.cpp
Assembler (ASM) dibuat (Message.s). Ia memiliki semua kode perakitan.
Langkah 3: Terjemahkan kode assembly ke kode Objek. Catatan: Message.s dibuat di Step2. g ++ -c. \ Message.s
File Objek dengan nama Message.o dibuat. Ini adalah bentuk biner.
Langkah 4: Menautkan file objek. Tugas ini dilakukan oleh linker
g ++. \ Message.o -o MessageApp
File exe MessageApp.exe dibuat di sini.
sumber