Recuerde, el preprocesador C / C ++ es un paso de procesamiento separado, puramente textual. La #include
directiva extrae el contenido del encabezado incluido y el compilador tiene que analizarlo. Por otra parte, la compilación de cada.cpp
es completamente separada, por lo que el hecho de que el compilador solo se analice B.h
al compilar B.cpp
no lo ayuda lo más mínimo cuando lo necesita nuevamente al compilar A.cpp
. Y de nuevo al compilar C.cpp
. Y D.cpp
. Y así. Y cada uno de esos archivos tiene que volver a compilarse si algún archivo incluido en él ha cambiado.
Digamos que class A
usa class B
y classes C
y D
use class A
, pero no necesita manipular B
. Si la clase A
se puede declarar solo con la declaración directa de B
, B.h
se compila dos veces: al compilar B.cpp
y A.cpp
(porque B
todavía se necesita dentro A
de los métodos).
Pero cuando se A.h
incluye B.h
, se compila cuatro veces, al compilar B.cpp
, A.cpp
, C.cpp
y D.cpp
como más tarde dos ahora indirectamente incluyen B.h
también.
Además, cuando el encabezado se incluye más de una vez, el preprocesador todavía tiene que leerlo cada vez. Omitirá el procesamiento de su contenido debido a la protección #ifdef
s, pero aún así lo lee y necesita buscar el final de la protección, lo que significa que tiene que analizar todas las directivas del preprocesador en su interior.
(Como se mencionó en la otra respuesta, los encabezados precompilados intentan solucionar esto, pero son su propia lata de gusanos; básicamente, puede usarlos razonablemente para los encabezados del sistema y solo si no está usando demasiados, pero no para encabezados en su proyecto)
vehicle.h
,bus.h
,toybus.h
.vehicle.h
incluir porbus.h
ebus.h
incluir portoybus.h
. por lo que si hago algún cambio enbus.h
. ¿el compilador se abre y analiza devehicle.h
nuevo? ¿lo compila de nuevo?