N'oubliez pas que le préprocesseur C / C ++ est une étape de traitement distincte, purement textuelle. La #include
directive extrait le contenu de l'en-tête inclus et le compilateur doit l'analyser. De plus, la compilation de chacun .cpp
est complètement séparée, donc le fait que le compilateur vient d'être analysé B.h
lors de la compilation B.cpp
ne l'aide pas du tout quand il en a besoin à nouveau lors de la compilation A.cpp
. Et encore lors de la compilation C.cpp
. Et D.cpp
. Etc. Et chacun de ces fichiers doit être recompilé si l'un des fichiers qu'il contient a changé.
Disons que la classe A
utilise la classe B
et les classes C
et D
utilise la classe A
, mais n'a pas besoin de manipuler B
. Si la classe A
peut être déclarée avec juste une déclaration directe de B
, alors elle B.h
est compilée deux fois: lors de la compilation B.cpp
et A.cpp
(car elle B
est toujours nécessaire dans A
les méthodes de).
Mais quand A.h
comprend B.h
, il est compilé quatre fois lors de la compilation- B.cpp
, A.cpp
, C.cpp
et D.cpp
comme plus tard , deux sont maintenant indirectement B.h
aussi.
De plus, lorsque l'en-tête est inclus plusieurs fois, le préprocesseur doit toujours le lire à chaque fois. Il sautera le traitement de son contenu à cause des protections #ifdef
, mais il le lit toujours et doit rechercher la fin de la protection, ce qui signifie qu'il doit analyser toutes les directives du préprocesseur à l'intérieur.
(Comme mentionné dans l'autre réponse, les en-têtes précompilés tentent de contourner ce problème, mais ils sont leur propre boîte de vers; en gros, vous pouvez raisonnablement les utiliser pour les en-têtes du système et uniquement si vous n'en utilisez pas trop, mais pas pour en-têtes de votre projet)
vehicle.h
,bus.h
,toybus.h
.vehicle.h
inclure parbus.h
etbus.h
inclure partoybus.h
. donc si je changebus.h
. le compilateur s'ouvre-t-il et analyse-vehicle.h
t-il à nouveau? le compile-t-il à nouveau?