Ingat, C / C ++ preprocessor adalah langkah pemrosesan terpisah, murni tekstual. The #include
tarikan direktif dalam isi header disertakan dan compiler harus mengurai itu. Selain itu, kompilasi masing-masing .cpp
benar-benar terpisah, sehingga fakta bahwa kompiler hanya diuraikan B.h
ketika mengkompilasi B.cpp
tidak membantunya ketika dibutuhkan lagi ketika mengkompilasi A.cpp
. Dan lagi saat kompilasi C.cpp
. Dan D.cpp
. Dan seterusnya. Dan masing-masing file tersebut harus dikompilasi ulang jika ada file yang termasuk di dalamnya telah berubah.
Jadi katakanlah kelas A
menggunakan kelas B
dan kelas C
dan D
menggunakan kelas A
, tetapi tidak perlu memanipulasi B
. Jika kelas A
dapat dideklarasikan hanya dengan deklarasi maju B
, daripada B.h
dikompilasi dua kali: ketika mengkompilasi B.cpp
dan A.cpp
(karena B
masih diperlukan di dalam A
metode).
Tapi ketika A.h
meliputi B.h
, dikompilasi empat kali-saat kompilasi B.cpp
, A.cpp
, C.cpp
dan D.cpp
sebagai kemudian dua sekarang secara tidak langsung termasuk B.h
juga.
Juga ketika tajuk dimasukkan lebih dari sekali, preprocessor masih harus membacanya setiap kali. Ini akan melewati pemrosesan kontennya karena #ifdef
pelindung, tetapi masih membacanya dan perlu mencari ujung penjaga, yang berarti harus menguraikan semua arahan preprosesor di dalam.
(Seperti yang disebutkan dalam jawaban lain, header yang dikompilasi berusaha untuk mengatasi hal ini, tetapi mereka adalah kaleng cacing mereka sendiri; pada dasarnya Anda dapat menggunakannya secara wajar untuk header sistem dan hanya jika Anda tidak menggunakan terlalu banyak dari mereka, tetapi tidak untuk header di proyek Anda)
vehicle.h
,bus.h
,toybus.h
.vehicle.h
termasuk olehbus.h
danbus.h
termasuk olehtoybus.h
. jadi jika saya melakukan beberapa perubahanbus.h
. apakah kompiler terbuka dan mem-parsingvehicle.h
lagi? apakah itu mengkompilasinya lagi?