Lembre-se, o pré-processador C / C ++ é uma etapa de processamento separada, puramente textual. A #includediretiva extrai o conteúdo do cabeçalho incluído e o compilador precisa analisá-lo. Além disso, a compilação de cada um .cppé completamente separada, portanto, o fato de o compilador apenas ser analisado B.hdurante a compilação B.cppnão ajuda muito quando é necessário novamente ao compilar A.cpp. E mais uma vez durante a compilação C.cpp. E D.cpp. E assim por diante. E cada um desses arquivos precisa ser recompilado se algum arquivo incluído tiver sido alterado.
Então, digamos que classe Ausa classe Be classes Ce Duse classe A, mas não precisa manipular B. Se a classe Apuder ser declarada apenas com declaração direta de B, então B.hserá compilado duas vezes: ao compilar B.cppe A.cpp(porque Bainda é necessário dentro Ados métodos).
Mas quando A.hinclui B.h, ele é compilado quatro vezes, ao compilar B.cpp, A.cpp, C.cppe D.cppcomo o mais tarde dois agora indiretamente incluem B.htambém.
Além disso, quando cabeçalho está incluído mais de uma vez, o pré-processador ainda tem que lê-lo cada vez. Irá pular o processamento do conteúdo por causa da proteção#ifdef , mas ainda a lê e precisa procurar o final da proteção, o que significa que precisa analisar todas as diretrizes do pré-processador.
(Como mencionado na outra resposta, os cabeçalhos pré-compilados tentam contornar isso, mas eles são sua própria lata de worms; basicamente você pode razoavelmente usá-los para cabeçalhos do sistema e somente se você não estiver usando muitos deles, mas não para cabeçalhos no seu projeto)
vehicle.h,bus.h,toybus.h.vehicle.hincluir porbus.hebus.hincluir portoybus.h. então se eu fizer alguma mudançabus.h. o compilador abre e analisavehicle.hnovamente? ele compila de novo?