N'oubliez pas que le préprocesseur C / C ++ est une étape de traitement distincte, purement textuelle. La #includedirective extrait le contenu de l'en-tête inclus et le compilateur doit l'analyser. De plus, la compilation de chacun .cppest complètement séparée, donc le fait que le compilateur vient d'être analysé B.hlors de la compilation B.cppne 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 Autilise la classe Bet les classes Cet Dutilise la classe A, mais n'a pas besoin de manipuler B. Si la classe Apeut être déclarée avec juste une déclaration directe de B, alors elle B.hest compilée deux fois: lors de la compilation B.cppet A.cpp(car elle Best toujours nécessaire dans Ales méthodes de).
Mais quand A.hcomprend B.h, il est compilé quatre fois lors de la compilation- B.cpp, A.cpp, C.cppet D.cppcomme plus tard , deux sont maintenant indirectement B.haussi.
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.hinclure parbus.hetbus.hinclure partoybus.h. donc si je changebus.h. le compilateur s'ouvre-t-il et analyse-vehicle.ht-il à nouveau? le compile-t-il à nouveau?