Esse é um desses tipos de padrões de codificação "deveria", em vez de "deve". O motivo é que você precisaria praticamente escrever um analisador de C ++ para aplicá-lo.
Uma regra muito comum para os arquivos de cabeçalho é que eles devem permanecer sozinhos. Um arquivo de cabeçalho não deve exigir que outros arquivos de cabeçalho sejam #incluídos antes de incluir o cabeçalho em questão. Este é um requisito testável. Dado algum cabeçalho aleatório foo.hh
, o seguinte deve compilar e executar:
#include "foo.hh"
int main () {
return 0;
}
Esta regra tem consequências no que diz respeito ao uso de outras classes em algum cabeçalho. Às vezes, essas consequências podem ser evitadas através da declaração direta dessas outras classes. Isso não é possível com muitas classes de biblioteca padrão. Não há como encaminhar uma instanciação de modelo como std::string
ou std::vector<SomeType>
. Você precisa #include
desses cabeçalhos STL no cabeçalho, mesmo que o único uso do tipo seja como argumento para uma função.
Outro problema está nas coisas que você arrasta acidentalmente. Exemplo: considere o seguinte:
arquivo foo.cc:
#include "foo.hh"
#include "bar.hh"
void Foo::Foo () : bar() { /* body elided */ }
void Foo::do_something (int item) {
...
bar.add_item (item);
...
}
Aqui bar
é uma classe Foo
membro de dados que é do tipo Bar
. Você fez a coisa certa aqui e #included bar.hh, embora isso devesse ter sido incluído no cabeçalho que define a classe Foo
. No entanto, você não incluiu o material usado por Bar::Bar()
e Bar::add_item(int)
. Existem muitos casos em que essas chamadas podem resultar em referências externas adicionais.
Se você analisar foo.o
com uma ferramenta como nm
, parece que as funções foo.cc
estão chamando todos os tipos de coisas para as quais você não fez o apropriado #include
. Então, você deve adicionar #include
diretrizes para essas referências externas incidentais foo.cc
? A resposta é absolutamente não. O problema é que é muito difícil distinguir as funções que são chamadas incidentalmente daquelas que são chamadas diretamente.