Última actualización: 26 Feb, 2026

Título - .h vs .hpp: ¿Cuál es la diferencia y cuál deberías usar?

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ísticaArchivo .hArchivo .hpp
Asociación de lenguajeC y C++Solo C++
¿Convención o regla?ConvenciónConvención
Uso en proyectos C++ComúnPreferido por algunos por claridad
Soporte de plantillas
Ambigüedad de códigoPosible en proyectos multilingüesMenos 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 .hpp cuando quieras señalar “esto es solo código C++”; mantén .h si trabajas en entornos que combinan C y C++.

Ver también