Denken Sie daran, dass der C / C ++ - Präprozessor ein separater, rein textueller Verarbeitungsschritt ist. Die #include
Direktive zieht den Inhalt des enthaltenen Headers ein und der Compiler muss ihn analysieren. Darüber hinaus ist die Kompilierung für jedes .cpp
Element vollständig getrennt, sodass die Tatsache, dass der Compiler B.h
beim Kompilieren nur analysiert wurde , B.cpp
keine 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 A
verwendet Klasse B
und Klassen C
und D
verwendet Klasse A
, muss aber nicht manipuliert werden B
. Wenn die Klasse A
nur mit forward deklariert werden kann B
, B.h
wird sie zweimal kompiliert: beim Kompilieren B.cpp
und A.cpp
(weil B
sie in A
den Methoden von noch benötigt wird ).
Aber wenn A.h
enthält B.h
, wird es kompiliert vier mal-beim Kompilieren B.cpp
, A.cpp
, C.cpp
und D.cpp
wie die später zwei nun indirekt enthalten B.h
auch.
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- #ifdef
Anweisungen, 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.h
include bybus.h
undbus.h
include bytoybus.h
. Also, wenn ich mich etwas änderebus.h
. öffnet und parst der Compiler dasvehicle.h
nochmal? Kompiliert es es erneut?