Reduce the number of #include files in header files. It will reduce build times. Instead, put include files in source code files and use forward declarations in header files.
Ich habe das hier gelesen. http://www.yolinux.com/TUTORIALS/LinuxTutorialC++CodingStyle.html .
Es heißt also, dass eine Klasse (Klasse A) in der Header-Datei nicht die tatsächliche Definition einer Klasse (Klasse B) verwenden muss. Zu diesem Zeitpunkt können wir die Forward-Deklaration verwenden, anstatt die bestimmte Header-Datei (Klasse B) einzuschließen.
Frage: Wenn die Klasse (Klasse A) im Header nicht die tatsächliche Definition einer bestimmten Klasse (Klasse B) verwendet, hilft die Forward-Deklaration dann, die Kompilierungszeit zu verkürzen.
quelle
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?#pragma once
oder#ifndef __VEHICLE_H_
Typdeklarationen in Header - Dateien , um solche Dateien zu verhindern , dass sie mehrmals enthalten ist (oder mehrmals im Fall von ifndef zumindest verwendet wird).denn dann muss A.hpp nicht #include B.hpp
so wird a.hpp
Wenn also A.hpp enthalten ist, ist B.hpp nicht implizit enthalten, und alle Dateien, die nur von A.hpp abhängen, müssen nicht bei jeder Änderung von b.hpp neu kompiliert werden
quelle
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 CompilerB.h
beim Kompilieren nur analysiert wurde ,B.cpp
keine Rolle spielt, wenn er es beim Kompilieren erneut benötigtA.cpp
. Und nochmal beim KompilierenC.cpp
. UndD.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 KlasseB
und KlassenC
undD
verwendet KlasseA
, muss aber nicht manipuliert werdenB
. Wenn die KlasseA
nur mit forward deklariert werden kannB
,B.h
wird sie zweimal kompiliert: beim KompilierenB.cpp
undA.cpp
(weilB
sie inA
den Methoden von noch benötigt wird ).Aber wenn
A.h
enthältB.h
, wird es kompiliert vier mal-beim KompilierenB.cpp
,A.cpp
,C.cpp
undD.cpp
wie die später zwei nun indirekt enthaltenB.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)
quelle
Eine Forward-Deklaration kann viel schneller analysiert werden als eine ganze Header-Datei, die selbst möglicherweise noch mehr Header-Dateien enthält.
Wenn Sie etwas in der Header-Datei für Klasse B ändern, muss alles, einschließlich dieses Headers, neu kompiliert werden. Bei einer Forward-Deklaration ist dies möglicherweise nur die Quelldatei, in der sich die Implementierung von A befindet. Wenn jedoch der Header von A tatsächlich den Header von B enthält, wird auch alles, was eingeschlossen
a.hpp
ist, neu kompiliert, selbst wenn nichts von B verwendet wird.quelle