โปรดจำไว้ว่าตัวประมวลผลล่วงหน้า 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.h
vehicle.h
bus.h
bus.h
toybus.h
bus.h
vehicle.h