Estou trabalhando em um motor de jogo básico, seguindo o conselho de incluir apenas o que preciso. Estou percebendo que em alguns lugares estou incluindo toneladas de coisas de certos módulos, como Math ou Render. E então é suposto manter essas longas listas regularmente para que seja realmente apenas o que se precisa, nem menos nem mais.
Mas é realmente tão importante incluir coisas que não preciso? Não posso simplesmente incluir Render.hpp e Math.hpp onde uso coisas de render e math e pronto, em vez de caçar todos os cabeçalhos para cada pequeno componente separadamente e manter uma longa lista de inclusões? O conselho profissional é sempre incluir apenas o que preciso, mas a maioria das bibliotecas que uso são incluídas por um include ou separadamente seus módulos principais, mas não todos os seus cabeçalhos um por um.
Incluir mais do que preciso realmente cria tanta bagunça e aumenta tanto o tempo de compilação/análise?
Na minha opinião, a resposta a essa pergunta depende se estamos falando de arquivos .cpp ou .h.
Para arquivos .cpp, a única desvantagem de incluir mais do que o estritamente necessário é o aumento do tempo de compilação. Dependendo do seu projeto e dos arquivos incluídos, pode variar de insignificante a significativo.
História completamente diferente se estivermos falando de arquivos de cabeçalho. Se você incluir arquivos desnecessários aqui, você pode introduzir dependências desnecessárias e isso pode ser ruim por mais motivos.
Por exemplo, digamos que você tenha os seguintes arquivos:
e assim por diante, e então você decidiu combinar todos os cabeçalhos:
e use isso
common.h
em todos os seus arquivos .cpp em vez de inclusões individuais.Agora, de repente,
a.cpp
não precisou mais de dependênciasome_lib_2
eb.cpp
passou a ter dependência desome_lib_1
.Isso pode exigir alterações na configuração da sua compilação e aumentar a complexidade de diferentes tarefas futuras, como testes de unidade, refatoração etc.
Este é um conselho , não o aplique cegamente, entenda por que ele existe para que você não entre em extremos como o uso excessivo de programação orientada a objetos e padrões de design que levaram a muitas bases de código horríveis em muitas empresas. Beber água é uma boa prática, mas beber muito pode levar à morte.
A desvantagem de incluir mais cabeçalhos é o aumento do tempo de compilação (e poluição do namespace em C ou se você usou incorretamente
using namespace
). Isso só é um problema em projetos grandes ou dependências enormes, como<Windows.h>
e suas exclusões de recursos#define
s . Eu diria que importar coisas não relacionadas ao seu código é uma prática ruim e pode violar a separação lógica, um mecanismo de jogo agnóstico de backend nunca importará cabeçalhos D3D12 ou Vulkan fora de partes que são específicas de backend.Pelo que você está dizendo, parece que ter vários arquivos de cabeçalho temáticos com várias inclusões tornaria seu projeto mais fácil de manter e menos trabalhoso. A troca provavelmente vale o aumento do tempo de compilação, especialmente se você perder mais tempo para descobrir a listagem exata do cabeçalho e o maior risco de erros na manutenção dessa listagem.
Todos os grandes motores de jogo na verdade têm alguns, se não um,
"Math.h"
com toda a álgebra linear regular e mais que eles usam. O mesmo para seus vários módulos. Você já identificou Math e Render como módulos que podem merecer seu próprio cabeçalho em sua pergunta, você pode criar variantes -internal.h#include
para o s comumente usado dentro desses módulos que não devem ser expostos publicamente a outros módulos que o usam.Então. Em C e C++,
#include
é literalmente um copiar e colar do conteúdo do arquivo incluído. Ter um arquivo com apenas#include
s é comum para criar cabeçalhos temáticos. Você deve pensar sobre o que você normalmente inclui e definir escopos abrangentes para cada cabeçalho para manter seu projeto sustentável.O que importa no final das contas é a solidez (veja meu exemplo sobre Vulkan/D3D12) e que você gaste menos tempo resolvendo problemas, esperando e sofrendo com seus
#include
problemas.