J'utilise .hpp parce que je veux que l'utilisateur différencie quels en-têtes sont des en-têtes C ++ et quels en-têtes sont des en-têtes C.
Cela peut être important lorsque votre projet utilise à la fois des modules C et C ++: comme quelqu'un d'autre l'a expliqué avant moi, vous devez le faire très soigneusement, et cela commence par le «contrat» que vous proposez via l'extension
.hpp: en-têtes C ++
(Ou .hxx, ou .hh, ou autre)
Cet en-tête est uniquement pour C ++.
Si vous êtes dans un module C, n'essayez même pas de l'inclure. Vous ne l'aimerez pas, car aucun effort n'est fait pour le rendre compatible C (trop serait perdu, comme la surcharge de fonctions, les espaces de noms, etc., etc.).
.h: en-têtes C compatibles ou purs C / C ++
Cet en-tête peut être inclus à la fois par une source C et par une source C ++, directement ou indirectement.
Il peut être inclus directement, étant protégé par la __cplusplus
macro:
- Ce qui signifie que, d'un point de vue C ++, le code compatible C sera défini comme
extern "C"
.
- D'un point de vue C, tout le code C sera clairement visible, mais le code C ++ sera caché (car il ne compilera pas dans un compilateur C).
Par exemple:
#ifndef MY_HEADER_H
#define MY_HEADER_H
#ifdef __cplusplus
extern "C"
{
#endif
void myCFunction() ;
#ifdef __cplusplus
} // extern "C"
#endif
#endif // MY_HEADER_H
Ou il pourrait être inclus indirectement par l'en-tête .hpp correspondant en le joignant à la extern "C"
déclaration.
Par exemple:
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
extern "C"
{
#include "my_header.h"
}
#endif // MY_HEADER_HPP
et:
#ifndef MY_HEADER_H
#define MY_HEADER_H
void myCFunction() ;
#endif // MY_HEADER_H
J'ai toujours considéré l'en-
.hpp
tête comme une sorte de valise.h
et de.cpp
fichiers ... un en-tête qui contient également des détails d'implémentation.Généralement, lorsque j'ai vu (et utilisé)
.hpp
une extension, il n'y a pas de.cpp
fichier correspondant . Comme d'autres l'ont dit, ce n'est pas une règle stricte et rapide, juste comment j'ai tendance à utiliser des.hpp
fichiers.la source
Peu importe quelle extension vous utilisez. L'un ou l'autre est OK.
J'utilise
*.h
pour C et*.hpp
pour C ++.la source
EDIT [Ajout d'une suggestion de Dan Nissenbaum]:
Par une convention, les fichiers .hpp sont utilisés lorsque les prototypes sont définis dans l'en-tête lui-même. De telles définitions dans les en-têtes sont utiles dans le cas des modèles, car le compilateur génère le code pour chaque type uniquement lors de l'instanciation du modèle. Par conséquent, s'ils ne sont pas définis dans les fichiers d'en-tête, leurs définitions ne seront pas résolues au moment de la liaison à partir d'autres unités de compilation. Si votre projet est un projet C ++ uniquement qui fait un usage intensif des modèles, cette convention sera utile.
Certaines bibliothèques de modèles qui adhèrent à cette convention fournissent des en-têtes avec des extensions .hpp pour indiquer qu'elles n'ont pas de fichiers .cpp correspondants.
une autre convention consiste à utiliser .h pour les en-têtes C et .hpp pour C ++; un bon exemple serait la bibliothèque boost.
la source
J'ai récemment commencé à utiliser
*.hpp
pour les en-têtes c ++.La raison en est que j'utilise emacs comme mon éditeur principal et qu'il passe automatiquement en mode c lorsque vous chargez un
*.h
fichier et en mode c ++ - lorsque vous chargez un*.hpp
fichier.Outre ce fait , je ne vois pas de bonnes raisons de choisir
*.h
plus*.hpp
ou vice-versa.la source
Je réponds à ceci comme rappel, pour donner le point à mon commentaire (s) sur la réponse "user1949346" à ce même OP.
Donc, comme beaucoup l'ont déjà répondu: dans les deux cas, c'est bien. Suivi par met l'accent sur leurs propres impressions.
Introduction, comme dans les commentaires précédents, je
C++
pense que les extensions d'en-tête sont proposées.h
s'il n'y a en fait aucune raison de s'y opposer.Étant donné que les documents ISO / CEI utilisent cette notation des fichiers d'en-tête et aucune correspondance de chaîne
.hpp
ne se produit même dans leurs documentations linguistiquesC++
.Mais je vise maintenant pour une raison acceptable POURQUOI l'un ou l'autre est correct, et surtout pourquoi il n'est pas sujet à la langue elle-même.
Alors c'est parti.
La
C++
documentation (je prends en fait référence à la version N3690) définit qu'un en-tête doit se conformer à la syntaxe suivante:Donc, comme nous pouvons l'extraire de cette partie, le nom du fichier d'en-tête peut également être tout ce qui est valide dans le code source. Sauf
'\n'
s'il contient des caractères et selon qu'il doit être inclus,<>
il n'est pas autorisé à contenir a>
. Ou, dans le cas""
contraire, s'il est inclus par -include, il n'est pas autorisé à contenir a"
.En d'autres termes: si vous aviez un environnement supportant les noms de fichiers comme
prettyStupidIdea.>
, un include comme:serait valide, mais:
serait invalide. L'inverse est le même.
Et même
serait un nom de fichier d'en-tête inclus valide.
Même ce serait conforme
C++
, ce serait une idée assez stupide, tho.Et c'est pourquoi
.hpp
est également valable.Mais ce n'est pas le résultat des décisions des comités sur la langue!
Donc, discuter de l'utilisation
.hpp
est la même chose que de le faire.cc
,.mm
ou de tout ce que j'ai lu dans d'autres articles sur ce sujet.Je dois admettre que je ne sais pas d'où
.hpp
vient 1 , mais je parierais qu'un inventeur d'un outil d'analyse, IDE ou autre chose concernéC++
est venu à cette idée pour optimiser certains processus internes ou simplement pour en inventer (probablement même pour eux nécessairement ) nouvelles conventions de dénomination.Mais cela ne fait pas partie de la langue.
Et chaque fois que l'on décide de l'utiliser de cette façon. Que ce soit parce qu'il aime le plus ou parce que certaines applications du flux de travail l' exigent, il n'a jamais 2 est une exigence de la langue. Donc, celui qui dit "le pp est parce qu'il est utilisé avec C ++", se trompe simplement en ce qui concerne la définition des langages.
C ++ permet tout ce qui respecte le paragraphe précédent. Et s'il y a quelque chose que le comité a proposé d'utiliser, alors il l'utilise
.h
puisque c'est l'extension poursuivie dans tous les exemples du document ISO.Conclusion:
Tant que vous ne voyez / ressentez aucun besoin d'utiliser
.h
plus.hpp
ou vice versa, vous ne devriez pas vous embêter. Parce que les deux formeraient un nom d'en-tête valide de même qualité par rapport à la norme. Et donc tout ce qui vous oblige à utiliser.h
ou.hpp
constitue une restriction supplémentaire de la norme qui pourrait même être en contradiction avec d'autres restrictions supplémentaires non conformes les unes aux autres. Mais comme OP ne mentionne aucune restriction de langue supplémentaire, c'est la seule réponse correcte et approuvable à la question" * .h ou * .hpp pour vos définitions de classe " est:
Les deux sont également corrects et applicables tant qu'aucune restriction externe n'est présente.
1 D'après ce que je sais, c'est apparemment le cadre de boost qui est venu avec cette
.hpp
extension.2 Bien sûr, je ne peux pas dire ce que certaines versions futures apporteront!
la source
Je préfère .hpp pour C ++ pour faire comprendre aux éditeurs et aux autres programmeurs qu'il s'agit d'un en-tête C ++ plutôt que d'un fichier d'en-tête C.
la source
C ++ ("C Plus Plus") a du sens en tant que .cpp
Avoir des fichiers d'en-tête avec une extension .hpp n'a pas le même flux logique.
la source
Vous pouvez appeler vos inclus comme bon vous semble.
Il suffit de spécifier ce nom complet dans le
#include
.Je suggère que si vous travaillez avec C à utiliser
.h
et quand avec C ++ à utiliser.hpp
.Ce n'est finalement qu'une convention.
la source
Codegear C ++ Builder utilise .hpp pour les fichiers d'en-tête générés automatiquement par les fichiers source Delphi et les fichiers .h pour vos "propres" fichiers d'en-tête.
Ainsi, lorsque j'écris un fichier d'en-tête C ++, j'utilise toujours .h.
la source
Dans l'un de mes emplois au début des années 90, nous avons utilisé respectivement .cc et .hh pour les fichiers source et d'en-tête. Je le préfère toujours à toutes les alternatives, probablement parce qu'il est plus facile à taper.
la source
Bjarne Stroustrup et Herb Sutter ont une déclaration à cette question dans leurs directives C ++ Core trouvées sur: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-source qui fait également référence aux derniers changements dans l'extension standard (C ++ 11, C ++ 14, etc.)
Je ne suis pas un grand fan de cette convention car si vous utilisez une bibliothèque populaire comme boost, votre cohérence est déjà rompue et vous devriez mieux utiliser .hpp.
la source
Comme beaucoup ici l'ont déjà mentionné, je préfère également utiliser .hpp pour les bibliothèques uniquement en-tête qui utilisent des classes / fonctions de modèle. Je préfère utiliser .h pour les fichiers d'en-tête accompagnés de fichiers source .cpp ou de bibliothèques partagées ou statiques.
La plupart des bibliothèques que je développe sont basées sur des modèles et doivent donc être uniquement en-tête, mais lors de l'écriture d'applications, j'ai tendance à séparer la déclaration de l'implémentation et à me retrouver avec des fichiers .h et .cpp
la source
Heureusement, c'est simple.
Vous devez utiliser l'extension .hpp si vous travaillez avec C ++ et vous devez utiliser .h pour C ou mélanger C et C ++.
la source
J'utilise .h parce que c'est ce que Microsoft utilise et ce que crée son générateur de code. Pas besoin d'aller à contre-courant.
la source
Dans "The C ++ Programming Language, Third Edition by Bjarne Stroustrup", le n ° 1 livre C ++ à lire absolument, il utilise * .h. Je suppose donc que la meilleure pratique consiste à utiliser * .h.
Cependant, * .hpp est bien aussi!
la source
.hpp
la langue elle-même.Il est facile pour les outils et les humains de différencier quelque chose . C'est ça.
En utilisation conventionnelle (par boost, etc.), il
.hpp
s'agit spécifiquement des en-têtes C ++. D'un autre côté,.h
concerne les en-têtes non C ++ uniquement (principalement C). Il est généralement difficile de détecter précisément la langue du contenu, car il existe de nombreux cas non triviaux, de sorte que cette différence rend souvent un outil prêt à l'emploi facile à écrire. Pour les humains, une fois la convention obtenue, elle est également facile à retenir et à utiliser.Cependant, je voudrais souligner que la convention elle-même ne fonctionne pas toujours, comme prévu.
.hpp
lui-même n'est pas le seul choix. Pourquoi pas.hh
ou.hxx
? (Quoi qu'il en soit, vous avez généralement besoin d'au moins une règle conventionnelle concernant les noms de fichiers et les chemins d'accès.)J'utilise personnellement les deux
.h
et.hpp
dans mes projets C ++. Je ne respecte pas la convention ci-dessus car:.h
fichiers sur github.com. (Il peut y avoir quelque chose dans les commentaires comme shebang pour que ces fichiers source soient de meilleures métadonnées, mais ce n'est même pas conventionnel comme les noms de fichiers, donc pas fiable en général.)J'utilise habituellement
.hpp
sur les en-têtes C ++ et les en-têtes doivent être utilisés (maintenus) dans un manière uniquement en-tête , par exemple comme bibliothèques de modèles. Pour les autres en-têtes de.h
, il existe soit un.cpp
fichier correspondant comme implémentation, soit un en-tête non C ++. Ce dernier est trivial pour se différencier à travers le contenu de l'en-tête par les humains (ou par des outils avec des métadonnées intégrées explicites, si nécessaire).la source
L'extension du fichier source peut avoir un sens pour votre système de construction, par exemple, vous pouvez avoir une règle dans votre makefile pour
.cpp
ou.c
fichiers, ou votre compilateur (par exemple Microsoftcl.exe
) peut compiler le fichier en C ou C ++ en fonction de l'extension.Étant donné que vous devez fournir le nom de fichier entier à la
#include
directive, l'extension de fichier d'en-tête n'est pas pertinente. Vous pouvez inclure un.c
fichier dans un autre fichier source si vous le souhaitez, car il s'agit simplement d'une inclusion textuelle. Votre compilateur peut avoir une option pour vider la sortie prétraitée qui le rendra clair (Microsoft:/P
pour prétraiter dans un fichier,/E
pour prétraiterstdout
,/EP
pour omettre des#line
directives,/C
pour conserver des commentaires)Vous pouvez choisir d'utiliser
.hpp
des fichiers qui ne concernent que l'environnement C ++, c'est-à-dire qu'ils utilisent des fonctionnalités qui ne se compileront pas en C.la source
Il n'y a aucun avantage à une extension particulière, à part que celle-ci peut avoir une signification différente pour vous, le compilateur et / ou vos outils.
header.h
est un en-tête valide.header.hpp
est un en-tête valide.header.hh
est un en-tête valide.header.hx
est un en-tête valide.h.header
est un en-tête valide.this.is.not.a.valid.header
est un en-tête valide en déni.ihjkflajfajfklaf
est un en-tête valide. Tant que le nom peut être analysé correctement par le compilateur et que le système de fichiers le prend en charge, c'est un en-tête valide, et le seul avantage de son extension est ce que l'on y lit.Cela étant dit, être capable de faire des hypothèses précises sur la base de l'extension est très utile, il serait donc judicieux d'utiliser un ensemble de règles facilement compréhensible pour vos fichiers d'en-tête. Personnellement, je préfère faire quelque chose comme ça:
.h
. Il n'y a aucune ambiguïté..h
, tandis qu'un en-tête compatible avec C ++ mais pas C obtient.hpp
ou.hh
ou quelque chose du genre.Bien sûr, cela n'est qu'une des nombreuses façons de gérer les extensions, et vous ne pouvez pas nécessairement faire confiance à votre première impression même si les choses semblent simples. Par exemple, j'ai vu la mention de l'utilisation
.h
pour les en-têtes normaux et.tpp
pour les en-têtes qui ne contiennent que des définitions pour les fonctions membres de classe de modèle, avec des.h
fichiers qui définissent les classes de modèle, y compris les.tpp
fichiers qui définissent leurs fonctions membres (au lieu de l'en-.h
tête contenant directement à la fois le déclaration de fonction et définition). Pour un autre exemple, bon nombre de personnes reflètent toujours le langage de l'en-tête dans son extension, même lorsqu'il n'y a aucune chance d'ambiguïté; pour eux,.h
est toujours un en-tête C et.hpp
(ou.hh
, ou.hxx
, etc.) est toujours un en-tête C ++. Et encore une fois, certaines personnes utilisent.h
pour "en-tête associé à un fichier source" et.hpp
pour "en-tête avec toutes les fonctions définies en ligne".Compte tenu de cela, le principal avantage serait de nommer systématiquement vos en-têtes dans le même style et de rendre ce style facilement visible pour quiconque examine votre code. De cette façon, toute personne familière avec votre style de codage habituel sera en mesure de déterminer ce que vous voulez dire avec une extension donnée en un coup d'œil.
la source