Saya sering menemukan bahwa bagian tajuk dari file menjadi lebih besar dan lebih besar setiap saat tetapi tidak pernah menjadi lebih kecil. Sepanjang kehidupan sebuah kelas file sumber mungkin telah dipindahkan dan telah di refactored dan sangat mungkin bahwa ada beberapa #includes
yang tidak perlu ada di sana dan lagi. Membiarkannya di sana hanya memperpanjang waktu kompilasi dan menambahkan dependensi kompilasi yang tidak perlu. Mencoba mencari tahu mana yang masih dibutuhkan bisa sangat membosankan.
Apakah ada beberapa alat yang dapat mendeteksi arahan #incian yang berlebihan dan menyarankan yang bisa saya hapus dengan aman?
Apakah serat melakukan ini mungkin?
c++
c
refactoring
include
dependencies
shoosh
sumber
sumber
Jawaban:
Ini tidak otomatis, tetapi doxygen akan menghasilkan diagram dependensi untuk
#included
file. Anda harus melalui mereka secara visual, tetapi mereka bisa sangat berguna untuk mendapatkan gambaran tentang apa yang menggunakan apa.sumber
Google cppclean (tautan ke: unduh , dokumentasi ) dapat menemukan beberapa kategori masalah C ++, dan sekarang dapat menemukan #termasuk berlebihan.
Ada juga alat berbasis dentang, termasuk apa yang Anda gunakan , yang dapat melakukan ini. include-what-you-use bahkan dapat menyarankan penerusan deklarasi (jadi Anda tidak perlu # mencantumkan terlalu banyak) dan secara opsional membersihkan #tidak termasuk untuk Anda.
Versi Eclipse CDT saat ini juga memiliki fungsi ini bawaan: masuk di bawah menu Sumber dan mengklik Susun Termasuk akan mengabjadkan # sertakan Anda, tambahkan setiap tajuk yang menurut Eclipse sedang Anda gunakan tanpa secara langsung memasukkannya, dan mengomentari tajuk apa pun yang tidak dikerjakannya. pikir kamu perlu. Namun, fitur ini tidak dapat diandalkan 100%.
sumber
Juga periksa termasuk apa yang Anda gunakan , yang memecahkan masalah serupa.
sumber
Masalah dengan mendeteksi termasuk berlebihan adalah bahwa itu tidak bisa hanya pemeriksa ketergantungan tipe. Sertakan berlebihan adalah file yang tidak memberikan nilai apa pun pada kompilasi dan tidak mengubah item lain yang bergantung pada file lain. Ada banyak cara file header dapat mengubah kompilasi, katakanlah dengan mendefinisikan konstanta, mendefinisikan ulang dan / atau menghapus makro yang digunakan, menambahkan namespace yang mengubah pencarian nama beberapa cara di baris. Untuk mendeteksi item seperti namespace yang Anda butuhkan lebih dari sekadar preprosesor, Anda sebenarnya hampir membutuhkan kompiler lengkap.
Lint lebih seperti pemeriksa gaya dan tentu saja tidak akan memiliki kemampuan penuh ini.
Saya pikir Anda akan menemukan satu-satunya cara untuk mendeteksi tambahan yang tidak berguna adalah dengan menghapus, mengkompilasi dan menjalankan suite.
sumber
Saya pikir PCLint akan melakukan ini, tetapi sudah beberapa tahun sejak saya melihatnya. Anda mungkin memeriksanya.
Saya melihat blog ini dan penulis berbicara sedikit tentang mengkonfigurasi PCLint untuk menemukan termasuk yang tidak digunakan. Mungkin patut dilihat.
sumber
The CScout refactoring Browser dapat mendeteksi berlebihan termasuk arahan di C (sayangnya tidak C ++) kode. Anda dapat menemukan penjelasan cara kerjanya dalam ini artikel jurnal.
sumber
Anda dapat menulis skrip cepat yang menghapus direktif #include tunggal, mengkompilasi proyek, dan mencatat nama di #include dan file itu dihapus dari dalam kasus jika tidak ada kesalahan kompilasi terjadi.
Biarkan berjalan pada malam hari, dan hari berikutnya Anda akan memiliki daftar file yang benar 100% yang dapat Anda hapus.
Terkadang brute-force hanya berfungsi :-)
sunting: dan terkadang tidak :-). Berikut sedikit informasi dari komentar:
sumber
Maaf untuk (kembali) memposting di sini, orang sering tidak memperluas komentar.
Periksa komentar saya untuk crashmstr, FlexeLint / PC-Lint akan melakukan ini untuk Anda. Pesan informasi 766. Bagian 11.8.1 manual saya (versi 8.0) membahas hal ini.
Juga, dan ini penting, tetap iterasi sampai pesannya hilang . Dengan kata lain, setelah menghapus tajuk yang tidak digunakan, jalankan kembali serat, lebih banyak file tajuk mungkin menjadi "tidak dibutuhkan" setelah Anda menghapus beberapa tajuk yang tidak dibutuhkan. (Itu mungkin terdengar konyol, baca perlahan & parsing, itu masuk akal.)
sumber
Saya tidak pernah menemukan alat lengkap yang memenuhi apa yang Anda minta. Hal terdekat yang saya gunakan adalah IncludeManager , yang membuat grafik pohon inklusi header Anda sehingga Anda dapat melihat secara visual hal-hal seperti header yang disertakan hanya dalam satu file dan inklusi header melingkar.
sumber
Saya sudah mencoba menggunakan Flexelint (versi unix PC-Lint) dan hasilnya agak beragam. Ini mungkin karena saya sedang mengerjakan basis kode yang sangat besar dan rumit. Saya merekomendasikan untuk memeriksa setiap file dengan hati-hati yang dilaporkan tidak digunakan.
Kekhawatiran utama adalah positif palsu. Beberapa menyertakan header yang sama dilaporkan sebagai header yang tidak dibutuhkan. Ini buruk karena Flexelint tidak memberi tahu Anda pada baris apa header tersebut disertakan atau di mana ia dimasukkan sebelumnya.
Salah satu cara alat otomatis dapat melakukan ini:
Di A.hpp:
Dalam B.hpp:
Dalam C.cpp:
Jika Anda mengikuti secara membabi buta pesan dari Flexelint Anda akan menghapus dependensi #include Anda. Ada lebih banyak kasus patologis, tetapi pada dasarnya Anda perlu memeriksa sendiri header untuk hasil terbaik.
Saya sangat merekomendasikan artikel ini tentang Struktur Fisik dan C ++ dari blog Games dari dalam. Mereka merekomendasikan pendekatan komprehensif untuk membersihkan #include mess:
sumber
Jika Anda menggunakan Eclipse CDT, Anda dapat mencoba http://includator.com yang gratis untuk penguji beta (pada saat penulisan ini) dan secara otomatis menghapus #includes berlebihan atau menambahkan yang hilang. Bagi pengguna yang memiliki FlexeLint atau PC-Lint dan menggunakan Elicpse CDT, http://linticator.com mungkin menjadi pilihan (juga gratis untuk pengujian beta). Meskipun menggunakan analisis Lint, ini memberikan perbaikan cepat untuk secara otomatis menghapus pernyataan #incul yang berlebihan.
sumber
Artikel ini menjelaskan teknik menghapus #include dengan menggunakan parsing Doxygen. Itu hanya skrip perl, jadi sangat mudah digunakan.
sumber
Mungkin sedikit terlambat, tapi saya pernah menemukan skrip perl WebKit yang melakukan apa yang Anda inginkan. Butuh adaptasi, saya percaya (saya tidak berpengalaman dalam perl), tetapi harus melakukan trik:
http://trac.webkit.org/browser/branches/old/safari-3-2-branch/WebKitTools/Scripts/find-extra-includes
(ini adalah cabang lama karena trunk tidak memiliki file lagi)
sumber
Ada alat gratis Sertakan Pengamat Ketergantungan File yang dapat diintegrasikan dalam studio visual. Ini menunjukkan # berlebihan termasuk dalam warna merah.
sumber
Ada dua jenis file #incul yang tidak berguna:
Ada 2 cara dalam pengalaman saya yang berfungsi baik untuk mendeteksinya:
gcc -H atau cl.exe / showincludes (menyelesaikan masalah 2)
Di dunia nyata, Anda dapat mengekspor CFLAGS = -H sebelum membuat, jika semua Makefile tidak menggantikan opsi CFLAGS. Atau seperti yang saya gunakan, Anda dapat membuat pembungkus cc / g ++ untuk menambahkan opsi -H secara paksa untuk setiap pemanggilan $ (CC) dan $ (CXX). dan tambahkan direktori wrapper ke variabel $ PATH, maka make Anda akan menggunakan perintah wrapper. Tentu saja pembungkus Anda harus memanggil kompiler gcc nyata. Trik ini perlu diubah jika Makefile Anda menggunakan gcc secara langsung. bukannya $ (CC) atau $ (CXX) atau dengan aturan tersirat.
Anda juga dapat mengkompilasi satu file dengan tweaker dengan baris perintah. Tetapi jika Anda ingin membersihkan tajuk untuk keseluruhan proyek. Anda dapat menangkap semua output dengan:
bersihkan
buat 2> & 1 | tee result.txt
PC-Lint / FlexeLint (menyelesaikan masalah 1 dan 2)
pastikan menambahkan opsi + e766, peringatan ini tentang: file header yang tidak digunakan.
pclint / flint -vf ...
Ini akan menyebabkan output pclint termasuk file header, file header bersarang akan diindentasi dengan tepat.
sumber
Untuk mengakhiri diskusi ini: c + + preprocessor turing selesai. Ini adalah properti semantik, apakah sebuah menyertakan tidak berguna. Oleh karena itu, mengikuti dari teorema Rice bahwa tidak dapat diputuskan apakah suatu menyertakan berlebihan atau tidak. Tidak BISA ada program, yang (selalu benar) mendeteksi apakah sebuah menyertakan berlebihan.
sumber
Berikut adalah cara brute force sederhana untuk mengidentifikasi header yang berlebihan . Itu tidak sempurna tetapi menghilangkan "jelas" termasuk yang tidak perlu. Menyingkirkan ini sangat membantu dalam membersihkan kode.
The Script dapat diakses langsung di GitHub.
sumber
Lint PC Perangkat Lunak Gimpel dapat melaporkan kapan file sertakan telah dimasukkan lebih dari satu kali dalam unit kompilasi
, tetapi tidak dapat menemukan file sertakan yang tidak diperlukan dalam cara yang Anda cari.Sunting: Itu bisa. Lihat jawabannya
sumber
CLion , C / C ++ IDE dari JetBrains, mendeteksi redundant termasuk out-of-the-box. Ini berwarna abu-abu di editor, tetapi ada juga fungsi untuk mengoptimalkan termasuk dalam file saat ini atau seluruh proyek .
Saya telah menemukan bahwa Anda membayar untuk fungsi ini; CLion membutuhkan waktu beberapa saat untuk memindai dan menganalisis proyek Anda saat pertama kali dimuat.
sumber