.h ou .hpp para arquivos de cabeçalho C++? Esclarecendo de uma vez por todas
Se você já programou em C++ por mais de algumas semanas, certamente já se deparou com esta questão. Você abre um projeto de outra pessoa — lá está .h. Você começa o seu — uma voz na sua cabeça diz: "Será que .hpp é mais legal?". Ou o contrário: você é um fã ferrenho de .h, e um colega afirma que .hpp é o único caminho correto.
Spoiler: ambas as opções são tecnicamente corretas. O compilador não se importa. Mas a diferença existe, e é importante para a organização do código, legibilidade e manutenção do projeto. Vamos entender o que está por trás dessas duas extensões e quando escolher cada uma.
Resposta curta: qual é a diferença fundamental?
De forma bem resumida:
.h— extensão tradicional para arquivos de cabeçalho, vinda do C. Usada tanto em C quanto em C++..hpp— extensão mais moderna, que indica explicitamente: "Isto é C++, não C". Foi criada para distinguir cabeçalhos C++ dos cabeçalhos C.
Mas o diabo, como sempre, está nos detalhes. Vamos nos aprofundar.
Contexto histórico: de onde vieram .h e .hpp?
A linguagem C usa .h para cabeçalhos desde tempos imemoriais. Quando o C++ surgiu, no início os programadores simplesmente continuaram usando .h — e isso é normal. A biblioteca padrão do C++ (por exemplo, <iostream>) abandonou completamente as extensões, mas isso já é outra história.
A extensão .hpp surgiu como resposta à necessidade de separar código C e C++. Imagine: você tem um grande projeto onde parte dos arquivos é em C, parte em C++. Você compila tudo, possivelmente com compiladores diferentes ou com flags diferentes. Como saber rapidamente qual cabeçalho é para qual linguagem? Isso mesmo — olhando para a extensão.
Assim, .hpp (de "C Plus Plus header") tornou-se o padrão de facto na comunidade para cabeçalhos puramente C++, especialmente em bibliotecas como Boost.
Quando usar .h?
Não se apresse em descartar o .h. Ele tem seus pontos fortes:
- Compatibilidade com C. Se o seu arquivo de cabeçalho precisa ser incluído tanto em código C quanto em C++ — use apenas
.h. Sem alternativas. - Projetos conservadores. Em bases de código grandes, onde o estilo foi estabelecido ao longo dos anos, mudar as extensões para
.hppé uma dor de cabeça desnecessária. - Minimalismo. Três caracteres em vez de quatro. Um detalhe, mas é agradável.
Exemplo: cabeçalho compatível com C e C++
// math_utils.h#ifndef MATH_UTILS_H#define MATH_UTILS_H
#ifdef __cplusplusextern "C" {#endif
int add(int a, int b);int multiply(int a, int b);
#ifdef __cplusplus}#endif
#endif // MATH_UTILS_HEsse arquivo pode ser incluído tanto em .c quanto em .cpp. Se você o nomeasse math_utils.hpp, um programador C poderia ficar confuso: "Isso é realmente para mim?".
Quando usar .hpp?
Aqui é o oposto: .hpp é a escolha do programador C++ moderno. Especialmente se:
- Você programa apenas em C++. Não há e não haverá C no projeto.
- Você usa templates, STL, exceções. São recursos puramente C++, e a extensão
.hppenfatiza isso. - Você quer separar explicitamente o código C++ do C. Em projetos mistos, isso evita confusão.
- Você segue práticas modernas. Boost, Qt (parcialmente), muitas bibliotecas novas usam
.hpp.
Exemplo: cabeçalho C++ típico com classe
// player.hpp#ifndef PLAYER_HPP#define PLAYER_HPP
#include <string>#include <vector>
class Player {public: Player(const std::string& nam