Uso .hpp porque quiero que el usuario diferencie qué encabezados son encabezados de C ++ y qué encabezados son encabezados de C.
Esto puede ser importante cuando su proyecto usa módulos C y C ++: como alguien más me explicó antes, debe hacerlo con mucho cuidado, y comienza con el "contrato" que ofrece a través de la extensión
.hpp: encabezados C ++
(O .hxx, o .hh, o lo que sea)
Este encabezado es solo para C ++.
Si está en un módulo C, ni siquiera intente incluirlo. No le gustará, porque no se hace ningún esfuerzo para hacerlo compatible con C (se perdería demasiado, como sobrecarga de funciones, espacios de nombres, etc., etc.).
.h: Encabezados C / C ++ compatibles o C puros
Este encabezado puede ser incluido por una fuente C y una fuente C ++, directa o indirectamente.
Se puede incluir directamente, estando protegido por la __cplusplus
macro:
- Lo que significa que, desde el punto de vista de C ++, el código compatible con C se definirá como
extern "C"
.
- Desde el punto de vista de C, todo el código de C será claramente visible, pero el código de C ++ estará oculto (porque no se compilará en un compilador de C).
Por ejemplo:
#ifndef MY_HEADER_H
#define MY_HEADER_H
#ifdef __cplusplus
extern "C"
{
#endif
void myCFunction() ;
#ifdef __cplusplus
} // extern "C"
#endif
#endif // MY_HEADER_H
O podría incluirse indirectamente por el encabezado .hpp correspondiente que lo incluye con la extern "C"
declaración.
Por ejemplo:
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
extern "C"
{
#include "my_header.h"
}
#endif // MY_HEADER_HPP
y:
#ifndef MY_HEADER_H
#define MY_HEADER_H
void myCFunction() ;
#endif // MY_HEADER_H
Siempre consideré que el
.hpp
encabezado era una especie de acrónimo.h
y de.cpp
archivos ... un encabezado que también contiene detalles de implementación.Típicamente cuando he visto (y uso)
.hpp
como una extensión, no hay un.cpp
archivo correspondiente . Como han dicho otros, esta no es una regla difícil y rápida, solo cómo tiendo a usar.hpp
archivos.fuente
No importa qué extensión uses. Cualquiera de los dos está bien.
Yo uso
*.h
para C y*.hpp
para C ++.fuente
EDITAR [Sugerencia agregada de Dan Nissenbaum]:
Por una convención, los archivos .hpp se usan cuando los prototipos se definen en el encabezado mismo. Dichas definiciones en los encabezados son útiles en el caso de las plantillas, ya que el compilador genera el código para cada tipo solo en la creación de instancias de plantilla. Por lo tanto, si no se definen en archivos de encabezado, sus definiciones no se resolverán en el momento del enlace desde otras unidades de compilación. Si su proyecto es un proyecto solo en C ++ que hace un uso intensivo de plantillas, esta convención será útil.
Ciertas bibliotecas de plantillas que se adhieren a esta convención proporcionan encabezados con extensiones .hpp para indicar que no tienen los archivos .cpp correspondientes.
otra convención es usar .h para encabezados C y .hpp para C ++; Un buen ejemplo sería la biblioteca de impulso.
fuente
Recientemente comencé a usar
*.hpp
para encabezados c ++.La razón es que uso emacs como mi editor principal y entra automáticamente en modo c cuando carga un
*.h
archivo y en modo c ++ cuando carga un*.hpp
archivo.Aparte el hecho de ver que no hay buenas razones para elegir
*.h
más*.hpp
o viceversa.fuente
Estoy respondiendo esto como un recordatorio, para dar un punto a mi comentario (s) sobre la respuesta "user1949346" a este mismo OP.
Entonces, como muchos ya respondieron: de cualquier manera está bien. Seguido por el énfasis de sus propias impresiones.
Introductorio, como también en los comentarios mencionados anteriormente, mi opinión es que
C++
se propone que las extensiones de encabezado sean.h
si en realidad no hay ninguna razón en contra.Dado que los documentos ISO / IEC usan esta notación de los archivos de encabezado y ni
.hpp
siquiera se produce una coincidencia de cadenas en sus documentaciones de idiomas sobreC++
.Pero ahora estoy apuntando a una razón aceptable POR QUÉ de cualquier manera está bien, y especialmente por qué no está sujeto al lenguaje en sí.
Así que, aquí vamos.
La
C++
documentación (en realidad estoy tomando referencia de la versión N3690) define que un encabezado debe cumplir con la siguiente sintaxis:Entonces, como podemos extraer de esta parte, el nombre del archivo de encabezado también puede ser cualquier cosa que sea válida en el código fuente. Excepto que contenga
'\n'
caracteres y dependiendo de si se va a incluir,<>
no está permitido que contenga a>
. O a la inversa, si está incluido por""
-include, no está permitido contener un"
.En otras palabras: si tenía un entorno que admitiera nombres de archivo como
prettyStupidIdea.>
, incluya como:sería válido, pero:
Sería inválido. Al revés lo mismo.
E incluso
sería un nombre de archivo de encabezado válido incluido
Incluso esto se conformaría
C++
, sería una idea bastante bastante estúpida, aunque.Y por eso también
.hpp
es válido.¡Pero no es el resultado de que los comités diseñen decisiones para el idioma!
Entonces, discutir sobre el uso
.hpp
es lo mismo que hacerlo.cc
,.mm
o sobre cualquier otra cosa que lea en otras publicaciones sobre este tema.Tengo que admitir que no tengo ni idea de dónde
.hpp
vino 1 , pero apostaría a que un inventor de alguna herramienta de análisis, IDE u otra cosa relacionadaC++
tuvo esta idea para optimizar algunos procesos internos o simplemente inventar algunos (probablemente incluso para ellos necesariamente ) nuevas convenciones de nomenclatura.Pero no es parte del lenguaje.
Y cada vez que uno decide usarlo de esta manera. Que sea porque le gusta la mayor parte o porque algunas aplicaciones de flujo de trabajo lo requieren, nunca 2 es un requisito de la lengua. Entonces, quien dice "el pp es porque se usa con C ++", simplemente está equivocado con respecto a la definición de los lenguajes.
C ++ permite cualquier cosa que respete el párrafo anterior. Y si hay algo que el comité propuso usar, entonces lo está usando
.h
ya que esta es la extensión demandada en todos los ejemplos del documento ISO.Conclusión:
Mientras no vea / sienta la necesidad de usar
.h
más.hpp
o viceversa, no debe molestarse. Porque ambos serían un nombre de encabezado válido de la misma calidad con respecto al estándar. Y, por lo tanto, cualquier cosa que REQUIERA que use.h
o.hpp
es una restricción adicional del estándar que incluso podría estar en contradicción con otras restricciones adicionales que no se ajustan entre sí. Pero como OP no menciona ninguna restricción de idioma adicional, esta es la única respuesta correcta y aprobable a la pregunta" * .h o * .hpp para sus definiciones de clase " es:
Ambos son igualmente correctos y aplicables siempre que no existan restricciones externas.
1 Por lo que sé, aparentemente, es el marco de impulso que surgió con esa
.hpp
extensión.2 ¡ Por supuesto que no puedo decir qué traerán algunas versiones futuras!
fuente
Prefiero .hpp para C ++ para dejar en claro tanto a los editores como a otros programadores que es un encabezado de C ++ en lugar de un archivo de encabezado de C.
fuente
C ++ ("C Plus Plus") tiene sentido como .cpp
Tener archivos de encabezado con una extensión .hpp no tiene el mismo flujo lógico.
fuente
Puedes llamar a tus incluye lo que quieras.
Solo necesita especificar ese nombre completo en el
#include
.Sugiero que si trabajas con C para usar
.h
y cuando con C ++ para usar.hpp
.Al final es solo una convención.
fuente
Codegear C ++ Builder utiliza .hpp para los archivos de encabezado generados automáticamente a partir de los archivos fuente de Delphi, y los archivos .h para sus "propios" archivos de encabezado.
Entonces, cuando escribo un archivo de encabezado C ++ siempre uso .h.
fuente
En uno de mis trabajos a principios de los 90, utilizamos .cc y .hh para los archivos fuente y de cabecera respectivamente. Todavía lo prefiero a todas las alternativas, probablemente porque es más fácil de escribir.
fuente
Bjarne Stroustrup y Herb Sutter tienen una declaración sobre esta pregunta en sus directrices básicas de C ++ que se encuentran en: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-source que también se refiere a los últimos cambios en la extensión estándar (C ++ 11, C ++ 14, etc.)
No soy un gran admirador de esta convención porque si está utilizando una biblioteca popular como boost, su consistencia ya está rota y debería usar mejor .hpp.
fuente
Como muchos aquí ya han mencionado, también prefiero usar .hpp para bibliotecas de solo encabezado que usan clases / funciones de plantilla. Prefiero usar .h para archivos de encabezado acompañados de archivos fuente .cpp o bibliotecas compartidas o estáticas.
La mayoría de las bibliotecas que desarrollo están basadas en plantillas y, por lo tanto, solo necesitan encabezados, pero cuando escribo aplicaciones tiendo a separar la declaración de la implementación y terminar con archivos .h y .cpp
fuente
Afortunadamente, es simple.
Debe usar la extensión .hpp si está trabajando con C ++ y debe usar .h para C o mezclar C y C ++.
fuente
Uso .h porque eso es lo que usa Microsoft, y lo que crea su generador de código. No hay necesidad de ir contra la corriente.
fuente
En "El lenguaje de programación C ++, tercera edición de Bjarne Stroustrup", el libro de C ++ que no se debe leer, utiliza * .h. Así que supongo que la mejor práctica es usar * .h.
Sin embargo, * .hpp también está bien.
fuente
.hpp
el lenguaje en sí no lo menciona en absoluto.Es fácil para las herramientas y los humanos diferenciar algo . Eso es.
En el uso convencional (por impulso, etc.), se
.hpp
trata específicamente de encabezados C ++. Por otra parte,.h
es solo para encabezados que no son C ++ (principalmente C). Detectar con precisión el idioma del contenido es generalmente difícil, ya que hay muchos casos no triviales, por lo que esta diferencia a menudo hace que una herramienta lista para usar sea fácil de escribir. Para los humanos, una vez que se obtiene la convención, también es fácil de recordar y fácil de usar.Sin embargo, señalaría que la convención en sí no siempre funciona, como se esperaba.
.hpp
en sí no es la única opción. ¿Por qué no.hh
o.hxx
? (Aunque de todos modos, generalmente necesita al menos una regla convencional sobre nombres de archivo y rutas).Yo personalmente uso ambos
.h
y.hpp
en mis proyectos de C ++. No sigo la convención anterior porque:.h
archivos en github.com (Puede haber algo en comentarios como shebang para que estos archivos de origen sean mejores metadatos, pero incluso no es convencional como los nombres de archivo, por lo que tampoco es confiable en general).Usualmente uso
.hpp
en encabezados de C ++ y los encabezados deben usarse (mantenerse) de una manera de solo encabezado , por ejemplo, como bibliotecas de plantillas. Para otros encabezados.h
, hay un.cpp
archivo correspondiente como implementación o es un encabezado que no es C ++. Este último es trivial para diferenciar a través del contenido del encabezado por humanos (o por herramientas con metadatos incrustados explícitos, si es necesario).fuente
La extensión del archivo fuente puede tener significado para su sistema de compilación, por ejemplo, puede tener una regla en su archivo MAKE para
.cpp
o.c
archivos, o su compilador (por ejemplo, Microsoftcl.exe
) puede compilar el archivo como C o C ++ dependiendo de la extensión.Como debe proporcionar el nombre de archivo completo a la
#include
directiva, la extensión del archivo de encabezado es irrelevante. Puede incluir un.c
archivo en otro archivo fuente si lo desea, porque es solo una inclusión textual. Su compilador podría tener una opción para volcar el resultado preprocesado que lo aclarará (Microsoft:/P
preprocesar para archivar,/E
preprocesarstdout
,/EP
omitir#line
directivas,/C
retener comentarios)Puede optar por usar
.hpp
para archivos que solo son relevantes para el entorno de C ++, es decir, usan funciones que no se compilan en C.fuente
No hay ninguna ventaja en ninguna extensión en particular, aparte de que puede tener un significado diferente para usted, el compilador y / o sus herramientas.
header.h
es un encabezado válidoheader.hpp
es un encabezado válidoheader.hh
es un encabezado válidoheader.hx
es un encabezado válidoh.header
es un encabezado válidothis.is.not.a.valid.header
es un encabezado válido en negación.ihjkflajfajfklaf
es un encabezado válido Mientras el compilador pueda analizar el nombre correctamente y el sistema de archivos lo admita, es un encabezado válido, y la única ventaja de su extensión es lo que se lee en él.Dicho esto, es muy útil poder hacer suposiciones con precisión basadas en la extensión , por lo que sería aconsejable utilizar un conjunto de reglas fácilmente comprensibles para sus archivos de encabezado. Personalmente, prefiero hacer algo como esto:
.h
. No hay ambigüedad..h
, mientras que una cabecera compatible con C ++, pero no consigue C.hpp
o.hh
o algo por el estilo.Esto, por supuesto, es solo una de las muchas maneras de manejar extensiones, y no necesariamente puede confiar en su primera impresión, incluso si las cosas parecen sencillas. Por ejemplo, he visto mencionar el uso
.h
de encabezados normales y.tpp
encabezados que solo contienen definiciones para funciones miembro de clase con plantilla, con.h
archivos que definen clases con plantilla, incluidos los.tpp
archivos que definen sus funciones miembro (en lugar del.h
encabezado que contiene directamente ambos declaración de función y la definición). Para otro ejemplo, muchas personas siempre reflejan el idioma del encabezado en su extensión, incluso cuando no hay posibilidad de ambigüedad; para ellos,.h
siempre es un encabezado C y.hpp
(o.hh
, o.hxx
, etc.) es siempre un encabezado de C ++. Y una vez más, algunas personas usan.h
"encabezado asociado con un archivo fuente" y.hpp
"encabezado con todas las funciones definidas en línea".Considerando esto, la principal ventaja vendría consistentemente nombrar sus encabezados en el mismo estilo, y hacer que ese estilo sea fácilmente evidente para cualquiera que examine su código. De esta manera, cualquier persona familiarizada con su estilo de codificación habitual podrá determinar lo que quiere decir con cualquier extensión dada con solo una mirada superficial.
fuente