โปรดจำไว้ว่าตัวประมวลผลล่วงหน้า C / C ++ เป็นขั้นตอนการประมวลผลที่แยกจากกันล้วนๆ #includeดึงคำสั่งในเนื้อหาของส่วนหัวรวมและคอมไพเลอร์ที่มีการแยกมัน นอกจากนี้ยังมีการสะสมของแต่ละ.cppแยกออกอย่างสมบูรณ์ดังนั้นความจริงที่ว่าคอมไพเลอร์เพียงแค่แยกวิเคราะห์B.hเมื่อรวบรวมไม่ได้ช่วยให้มันน้อยเมื่อมันต้องการมันอีกครั้งเมื่อรวบรวมB.cpp และอีกครั้งเมื่อรวบรวมA.cpp C.cppและD.cpp. และอื่น ๆ และแต่ละไฟล์เหล่านั้นจะต้องทำการคอมไพล์ใหม่หากไฟล์ใด ๆ ที่รวมอยู่ในนั้นมีการเปลี่ยนแปลง
เพื่อบอกว่าระดับAชั้นการใช้งานBและการเรียนCและDระดับการใช้งานแต่ไม่จำเป็นต้องจัดการA BหากคลาสAสามารถประกาศด้วยเพียงการประกาศไปข้างหน้าBกว่าB.hจะรวบรวมสองครั้ง: เมื่อรวบรวมB.cppและA.cpp(เพราะBยังคงต้องการในAวิธีการของ)
แต่เมื่อA.hรวมB.hก็จะรวบรวมสี่ครั้งเมื่อรวบรวมB.cpp, A.cpp, C.cppและD.cppเป็นต่อมาสองตอนนี้ทางอ้อม ได้แก่B.hเกินไป
นอกจากนี้เมื่อรวมส่วนหัวมากกว่าหนึ่งครั้งตัวประมวลผลล่วงหน้ายังคงต้องอ่านทุกครั้ง มันจะข้ามการประมวลผลเนื้อหาเนื่องจากการป้องกัน#ifdefแต่ก็ยังอ่านและต้องการค้นหาจุดจบของการ์ดซึ่งหมายความว่าต้องแยกคำสั่ง preprocessor ทั้งหมดภายใน
(ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ ส่วนหัวที่คอมไพล์แล้วพยายามที่จะหลีกเลี่ยงปัญหานี้ แต่มันเป็นเวิร์มของตัวเองโดยทั่วไปคุณสามารถใช้พวกมันสำหรับหัวของระบบได้และถ้าคุณไม่ได้ใช้มันมากเกินไป ส่วนหัวในโครงการของคุณ)
vehicle.h, ,bus.hรวมไว้โดยและรวมไว้โดย ดังนั้นถ้าผมจะเปลี่ยนในบาง คอมไพเลอร์ไม่เปิดและแยก อีกครั้งหรือไม่ มันรวบรวมอีกครั้งหรือไม่toybus.hvehicle.hbus.hbus.htoybus.hbus.hvehicle.h