Denken Sie daran, dass der C / C ++ - Präprozessor ein separater, rein textueller Verarbeitungsschritt ist. Die #includeDirektive zieht den Inhalt des enthaltenen Headers ein und der Compiler muss ihn analysieren. Darüber hinaus ist die Kompilierung für jedes .cppElement vollständig getrennt, sodass die Tatsache, dass der Compiler B.hbeim Kompilieren nur analysiert wurde , B.cppkeine Rolle spielt, wenn er es beim Kompilieren erneut benötigt A.cpp. Und nochmal beim Kompilieren C.cpp. Und D.cpp. Und so weiter. Und jede dieser Dateien muss neu kompiliert werden, wenn sich eine darin enthaltene Datei geändert hat.
Angenommen, die Klasse Averwendet Klasse Bund Klassen Cund Dverwendet Klasse A, muss aber nicht manipuliert werden B. Wenn die Klasse Anur mit forward deklariert werden kann B, B.hwird sie zweimal kompiliert: beim Kompilieren B.cppund A.cpp(weil Bsie in Aden Methoden von noch benötigt wird ).
Aber wenn A.henthält B.h, wird es kompiliert vier mal-beim Kompilieren B.cpp, A.cpp, C.cppund D.cppwie die später zwei nun indirekt enthalten B.hauch.
Auch wenn der Header mehrmals enthalten ist, muss er vom Präprozessor jedes Mal gelesen werden . Es überspringt die Verarbeitung seines Inhalts aufgrund der Guarding- #ifdefAnweisungen, liest sie jedoch weiterhin und muss nach dem Ende der Guard-Anweisung suchen, was bedeutet, dass alle darin enthaltenen Präprozessor-Anweisungen analysiert werden müssen.
(Wie in der anderen Antwort erwähnt, versuchen vorkompilierte Header, dies zu umgehen, aber es handelt sich um ihre eigene Wurmbüchse. Grundsätzlich können Sie sie vernünftigerweise für Systemheader verwenden, und zwar nur, wenn Sie nicht zu viele, aber nicht für Überschriften in Ihrem Projekt)
vehicle.h,bus.h,toybus.h.vehicle.hinclude bybus.hundbus.hinclude bytoybus.h. Also, wenn ich mich etwas änderebus.h. öffnet und parst der Compiler dasvehicle.hnochmal? Kompiliert es es erneut?