.h o .hpp para archivos de encabezado de C++? Lo aclaramos de una vez por todas
Si alguna vez has escrito en C++ durante más de un par de semanas, seguramente te has enfrentado a esta pregunta. Abres un proyecto ajeno — allí está .h. Empiezas el tuyo — una voz en tu cabeza dice: «¿Quizás .hpp es mejor?». O al revés: eres un fanático acérrimo de .h, y un colega afirma que .hpp es el único camino correcto.
Advertencia: ambas opciones son técnicamente correctas. Al compilador le da igual. Pero la diferencia existe, y es importante para la organización del código, la legibilidad y el mantenimiento del proyecto. Analicemos qué hay detrás de estas dos extensiones y cuándo elegir cada una.
Respuesta corta: ¿cuál es la diferencia fundamental?
En resumen:
.h— la extensión tradicional para archivos de encabezado, heredada de C. Se usa tanto en C como en C++..hpp— una extensión más moderna que indica explícitamente: «Esto es C++, no C». Fue creada para distinguir los encabezados de C++ de los de C.
Pero el diablo, como siempre, está en los detalles. Profundicemos.
Contexto histórico: ¿de dónde vienen .h y .hpp?
El lenguaje C ha usado .h para encabezados desde tiempos inmemoriales. Cuando apareció C++, al principio los programadores simplemente continuaron usando .h — y eso está bien. La biblioteca estándar de C++ (por ejemplo, <iostream>) incluso abandonó las extensiones, pero esa es otra historia.
La extensión .hpp surgió como respuesta a la necesidad de separar el código C y C++. Imagina: tienes un proyecto grande donde algunos archivos son en C y otros en C++. Lo compilas, quizás con diferentes compiladores o con diferentes banderas. ¿Cómo saber rápidamente qué encabezado es para qué lenguaje? Exacto — mirando la extensión.
Así, .hpp (de «C Plus Plus header») se convirtió en el estándar de facto en la comunidad para encabezados puramente de C++, especialmente en bibliotecas como Boost.
¿Cuándo usar .h?
No te apresures a descartar .h. Tiene sus puntos fuertes:
- Compatibilidad con C. Si tu archivo de encabezado debe ser incluido tanto desde código C como C++ — solo
.h. Sin opciones. - Proyectos conservadores. En bases de código grandes donde el estilo se ha consolidado durante años, cambiar las extensiones a
.hppes un dolor innecesario. - Minimalismo. Tres caracteres en lugar de cuatro. Un detalle, pero agradable.
Ejemplo: encabezado compatible con C y 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_HEste archivo se puede incluir tanto en .c como en .cpp. Si lo hubieras llamado math_utils.hpp, un programador de C podría confundirse: «¿Esto es realmente para mí?».
¿Cuándo usar .hpp?
Aquí es al revés: .hpp es la elección del programador moderno de C++. Especialmente si:
- Solo escribes en C++. No hay ni habrá nada de C en el proyecto.
- Usas plantillas, STL, excepciones. Son características puramente de C++, y la extensión
.hpplo resalta. - Quieres separar explícitamente el código C++ del C. En proyectos mixtos, esto evita confusiones.
- Sigues prácticas modernas. Boost, Qt (parcialmente), muchas bibliotecas nuevas usan
.hpp.
Ejemplo: encabezado típico de C++ con una clase
// player.hpp#ifndef PLAYER_HPP#define PLAYER_HPP
#include <string>#include <vector>
class Player {public: Player(const std::string& nam