No dudes en divulgar nuestro sitio y códigos con tus amigos, ayúdanos a aumentar nuestra comunidad.
Solución:
Aquí hay un par de razones para tener diferentes nombres de encabezados C vs C++:
- Formateo automático de código, es posible que tenga diferentes pautas para formatear el código C y C++. Si los encabezados están separados por extensión, puede configurar su editor para que aplique el formato apropiado automáticamente
- Nombrando, he estado en proyectos donde había bibliotecas escritas en C y luego se habían implementado contenedores en C++. Dado que los encabezados generalmente tenían nombres similares, es decir, Feature.h vs Feature.hpp, eran fáciles de diferenciar.
- Inclusión, tal vez su proyecto tenga versiones más apropiadas disponibles escritas en C++ pero está usando la versión C (ver el punto anterior). Si los encabezados tienen el nombre del idioma en el que están implementados, puede detectar fácilmente todos los encabezados C y verificar las versiones de C++.
Recuerda, C es no C++ y puede ser muy peligroso mezclar y combinar a menos que sepa lo que está haciendo. Nombrar sus fuentes apropiadamente lo ayuda a diferenciar los idiomas.
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 explicó antes que yo, debe hacerlo con mucho cuidado y comienza con el “contrato” que ofrece a través de la extensión.
.hpp: encabezados de 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 que sea compatible con C (se perdería demasiado, como sobrecarga de funciones, espacios de nombres, etc., etc.).
.h: encabezados C puros o compatibles con C/C++
Este encabezado puede ser incluido tanto por una fuente C como por una fuente C++, directa o indirectamente.
Puede incluirse 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 en el encabezado .hpp correspondiente encerrándolo con el 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é la .hpp
cabecera para ser una especie de baúl de viaje de .h
y .cpp
archivos… un encabezado que contiene detalles de implementación también.
Por lo general, cuando he visto (y uso) .hpp
como una extensión, no hay correspondiente .cpp
Archivo. Como han dicho otros, esta no es una regla estricta y rápida, solo cómo tiendo a usar .hpp
archivos