Ingat, C / C ++ preprocessor adalah langkah pemrosesan terpisah, murni tekstual. The #includetarikan direktif dalam isi header disertakan dan compiler harus mengurai itu. Selain itu, kompilasi masing-masing .cppbenar-benar terpisah, sehingga fakta bahwa kompiler hanya diuraikan B.hketika mengkompilasi B.cpptidak 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 Amenggunakan kelas Bdan kelas Cdan Dmenggunakan kelas A, tetapi tidak perlu memanipulasi B. Jika kelas Adapat dideklarasikan hanya dengan deklarasi maju B, daripada B.hdikompilasi dua kali: ketika mengkompilasi B.cppdan A.cpp(karena Bmasih diperlukan di dalam Ametode).
Tapi ketika A.hmeliputi B.h, dikompilasi empat kali-saat kompilasi B.cpp, A.cpp, C.cppdan D.cppsebagai kemudian dua sekarang secara tidak langsung termasuk B.hjuga.
Juga ketika tajuk dimasukkan lebih dari sekali, preprocessor masih harus membacanya setiap kali. Ini akan melewati pemrosesan kontennya karena #ifdefpelindung, 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.htermasuk olehbus.hdanbus.htermasuk olehtoybus.h. jadi jika saya melakukan beberapa perubahanbus.h. apakah kompiler terbuka dan mem-parsingvehicle.hlagi? apakah itu mengkompilasinya lagi?