Por que não escrevemos código no ficheiro de cabeçalho?
sobes.tech IA
Resposta da IA
O código nos ficheiros de cabeçalho (.h ou .hpp em C++) não deve ser colocado pelas seguintes razões:
-
Violação da regra de uma única definição (One Definition Rule - ODR). Quando vários ficheiros
.cppincluem um ficheiro de cabeçalho que contém código executável, este será definido mais do que uma vez, levando a um erro de ligação (definição múltipla). A exceção são as funçõesinlinee os modelos de classes/funções, que devem ser definidos em cada módulo de tradução onde são utilizados.// exemplo.h int g_counter = 0; // Variável global - violação da ODR void my_function() { // Função - violação da ODR // código } inline void my_inline_function() { // função inline - exceção // código } template<typename T> void process(T value) { // modelo de função - exceção // código } -
Aumento do tempo de compilação. Cada inclusão de um ficheiro de cabeçalho faz com que o compilador processe novamente o seu conteúdo. Colocar código em ficheiros de cabeçalho aumenta a carga de trabalho do compilador, atrasando o processo de construção do projeto, especialmente em projetos grandes.
-
Complexidade na manutenção e testes. O código disperso em ficheiros de cabeçalho torna-se menos modular. Isto dificulta o teste de componentes individuais e a sua alteração independente.
-
Risco de ciclos de inclusão (include loops). Uma organização incorreta das inclusões com código em ficheiros de cabeçalho pode levar a dependências cíclicas e problemas de compilação.
Nos ficheiros de cabeçalho, geralmente declara-se:
- Classes (definições, mas não implementações de métodos)
- Funções (protótipos)
- Variáveis globais (usando
extern) - Constantes
- Modelos de classes e funções (definições completas)
- Funções
inline(definições completas) - Tipos de dados (
struct,enum,typedef,using) - Espaços de nomes (
namespace)
A implementação do código (corpo das funções, definições de membros estáticos de classes e variáveis globais) é colocada nos ficheiros de implementação correspondentes (.cpp).