Última actualización: 26 Feb, 2026

Al escribir programas en C++, especialmente en proyectos grandes, organizar tu código en varios archivos es esencial para la legibilidad y el mantenimiento. Esto suele implicar el uso de archivos de encabezado, que tienen las extensiones .h o .hpp. Pero, ¿cuál es la diferencia entre estos dos y cuál deberías usar?
En este artículo, desglosaremos las diferencias entre los archivos .h y .hpp, exploraremos su historia y ofreceremos orientación sobre las mejores prácticas.
Entendiendo los archivos de encabezado en C++
Los archivos de encabezado contienen declaraciones de funciones, clases, constantes y macros que puedes incluir en varios archivos fuente. Estos archivos se incluyen luego en los archivos .cpp (fuente C++) mediante la directiva #include.
Contenido común de los archivos de encabezado
- Definiciones de clases
- Declaraciones de funciones
- Definiciones de constantes
- Macros
- Plantillas (en algunos casos)
Archivos .h
¿Qué es un archivo .h?
Los archivos .h son los archivos de encabezado tradicionales y fueron ampliamente usados por primera vez en el lenguaje de programación C. Todavía se utilizan en proyectos tanto de C como de C++ para declarar interfaces.
Ejemplo de uso:
// mathutils.h
#ifndef MATHUTILS_H
#define MATHUTILS_H
int add(int a, int b);
int subtract(int a, int b);
#endif
Ventajas:
- Reconocidos universalmente (usados tanto en C como en C++).
- Adecuados para proyectos que involucran código tanto en C como en C++.
Desventajas:
- Pueden generar ambigüedad en proyectos C++ sobre si el archivo es de estilo C o C++.
Archivos .hpp
¿Qué es un archivo .hpp?
Los archivos .hpp son archivos de encabezado específicos de C++. Funcionan igual que los archivos .h pero se usan para indicar explícitamente que el encabezado está destinado al código C++.
Ejemplo de uso:
// vectorutils.hpp
#ifndef VECTORUTILS_HPP
#define VECTORUTILS_HPP
#include <vector>
std::vector<int> filter_even(const std::vector<int>& input);
#endif
Ventajas:
- Indica claramente que el archivo está destinado al código C++.
- Evita confusiones al mezclar C y C++.
- Útil en proyectos multilingües o equipos que siguen convenciones de nombres estrictas.
Desventajas:
- Un poco menos comunes en bases de código más antiguas.
- No son reconocidos por algunos sistemas heredados que esperan
.h.
.h vs .hpp: Diferencias clave
| Característica | Archivo .h | Archivo .hpp |
|---|---|---|
| Asociación de lenguaje | C y C++ | Solo C++ |
| ¿Convención o regla? | Convención | Convención |
| Uso en proyectos C++ | Común | Preferido por algunos por claridad |
| Soporte de plantillas | Sí | Sí |
| Ambigüedad de código | Posible en proyectos multilingües | Menos probable |
Mejores prácticas para elegir entre .h y .hpp
A continuación, algunas pautas generales para ayudarte a elegir:
Usa .h si:
- Estás escribiendo código que debe ser compatible tanto con C como con C++.
- Mantienes o amplías código heredado que ya usa
.h.
Usa .hpp si:
- Quieres dejar claro que el archivo es específico de C++.
- Trabajas en un proyecto exclusivamente C++ o usas características propias de C++ como clases, plantillas y espacios de nombres.
Estructuras de proyecto comunes
Ejemplo con .h:
project/
├── main.cpp
├── mathutils.h
└── mathutils.cpp
Ejemplo con .hpp:
project/
├── main.cpp
├── vectorutils.hpp
└── vectorutils.cpp
Ambas estructuras son válidas; la diferencia radica principalmente en la claridad y las preferencias del equipo.
Conclusión
La elección entre .h y .hpp es mayormente una cuestión de convención, no de funcionalidad. Ambos sirven para declarar interfaces y código compartido entre varios archivos fuente de C++.
Sin embargo, para código específico de C++, usar .hpp puede hacer tus intenciones más claras y ayudar a evitar confusiones en bases de código más grandes, especialmente aquellas que involucran varios lenguajes. Para proyectos multilingües o heredados, .h podría seguir siendo la mejor opción.
Punto clave:
Usa
.hppcuando quieras señalar “esto es solo código C++”; mantén.hsi trabajas en entornos que combinan C y C++.