.h o .hpp para archivos de encabezado de C++? Lo aclaramos de una vez por todas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

.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 .hpp es 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_H


Este 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 .hpp lo 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

Blogs

Book Recommendations