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.
Eu li isso aqui. http://www.yolinux.com/TUTORIALS/LinuxTutorialC++CodingStyle.html .
Por isso, diz se uma classe (classe A) no arquivo de cabeçalho não precisa usar a definição real de alguma classe (classe B). Nesse momento, podemos usar a declaração direta em vez de incluir o arquivo de cabeçalho específico (classe B).
Pergunta: Se a classe (classe A) no cabeçalho se não usar a definição real de uma classe específica (classe B), então como a declaração direta ajuda a reduzir o tempo de compilação?
fonte
vehicle.h
,bus.h
,toybus.h
.vehicle.h
incluir porbus.h
ebus.h
incluir portoybus.h
. então se eu fizer alguma mudançabus.h
. o compilador abre e analisavehicle.h
novamente? ele compila de novo?#pragma once
ou#ifndef __VEHICLE_H_
digita declarações nos arquivos de cabeçalho para impedir que esses arquivos sejam incluídos várias vezes (ou sejam usados várias vezes, pelo menos no caso de ifndef).porque então A.hpp não precisa #incluir B.hpp
então A.hpp se torna
portanto, quando A.hpp é incluído, o B.hpp não é incluído implicitamente e todos os arquivos que dependem apenas do A.hpp não precisam ser recompilados cada vez que o b.hpp é alterado
fonte
Lembre-se, o pré-processador C / C ++ é uma etapa de processamento separada, puramente textual. A
#include
diretiva 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 analisadoB.h
durante a compilaçãoB.cpp
não ajuda muito quando é necessário novamente ao compilarA.cpp
. E mais uma vez durante a compilaçãoC.cpp
. ED.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
A
usa classeB
e classesC
eD
use classeA
, mas não precisa manipularB
. Se a classeA
puder ser declarada apenas com declaração direta deB
, entãoB.h
será compilado duas vezes: ao compilarB.cpp
eA.cpp
(porqueB
ainda é necessário dentroA
dos métodos).Mas quando
A.h
incluiB.h
, ele é compilado quatro vezes, ao compilarB.cpp
,A.cpp
,C.cpp
eD.cpp
como o mais tarde dois agora indiretamente incluemB.h
també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)
fonte
Uma declaração de encaminhamento é muito mais rápida de analisar do que um arquivo de cabeçalho inteiro, que por si só pode incluir ainda mais arquivos de cabeçalho.
Além disso, se você alterar algo no arquivo de cabeçalho da classe B, tudo, inclusive esse cabeçalho, terá que ser recompilado. Com uma declaração de encaminhamento, esse pode ser apenas o arquivo de origem em que a implementação de A está residindo. Mas se o cabeçalho de A realmente incluísse o cabeçalho de B, tudo o que incluir
a.hpp
também será recompilado, mesmo que não use nada de B.fonte