Question * .h ou * .hpp pour vos définitions de classe


J'ai toujours utilisé un *.h fichier pour mes définitions de classe, mais après avoir lu le code de la bibliothèque de boost, je me suis rendu compte qu'ils utilisent tous *.hpp. J'ai toujours eu une aversion pour cette extension de fichier, je pense surtout parce que je n'y suis pas habitué.

Quels sont les avantages et les inconvénients de l'utilisation *.hpp plus de *.h?


411
2017-09-30 10:47


origine


Réponses:


Voici quelques raisons pour avoir un nom différent des en-têtes C et C ++:

  • La mise en forme automatique du code, vous pourriez avoir des directives différentes pour le formatage du code C et C ++. Si les en-têtes sont séparés par extension, vous pouvez configurer votre éditeur pour qu'il applique automatiquement la mise en forme appropriée
  • En nommant, j'ai été sur des projets où il y avait des bibliothèques écrites en C et ensuite les wrappers avaient été implémentés en C ++. Comme les en-têtes avaient généralement des noms similaires, à savoir Feature.h vs Feature.hpp, ils étaient faciles à distinguer.
  • Inclusion, peut-être votre projet a-t-il des versions plus appropriées disponibles en C ++ mais vous utilisez la version C (voir point ci-dessus). Si les en-têtes sont nommés d'après la langue dans laquelle ils sont implémentés, vous pouvez facilement repérer tous les en-têtes C et vérifier les versions C ++.

Rappelez-vous que C est ne pas C ++ et il peut être très dangereux de mélanger et assortir à moins que vous sachiez ce que vous faites. Nommer vos sources de manière appropriée vous permet de différencier les langues.


423
2017-09-30 11:41



J'utilise .hpp parce que je veux que l'utilisateur différencie quels en-têtes sont les en-têtes C ++, et quels en-têtes sont les en-têtes C.

Cela peut être important lorsque votre projet utilise à la fois les modules C et C ++: comme quelqu'un d'autre l'a expliqué avant moi, vous devriez le faire très soigneusement et commencer par le "contrat" ​​que vous proposez via l'extension

.hpp: en-têtes C ++

(Ou .hxx, ou .hh, ou peu importe)

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 convivial (trop de choses seraient perdues, comme la surcharge des fonctions, les espaces de noms, etc.).

.h: C / C ++ compatible ou pur C Headers

Cet en-tête peut être inclus à la fois par une source C et une source C ++, directement ou indirectement.

Il peut être inclus directement, protégé par le __cplusplus macro:

  • Ce qui signifie que, du point de vue C ++, le code C-compatible 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é (parce qu'il ne sera pas compilé 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 l'enfermant avec le 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

183
2017-09-30 18:57



J'ai toujours considéré le .hpp en-tête pour être une sorte de portemanteau de .h et .cpp fichiers ... un en-tête qui contient également des détails d'implémentation.

Typiquement quand j'ai vu (et utilisé) .hpp en extension, il n'y a pas de correspondance .cpp fichier. Comme d’autres l’ont dit, ce n’est pas une règle stricte, comme j’ai tendance à utiliser .hppdes dossiers.


37
2017-09-30 14:28



MODIFIER [Ajout d'une suggestion de Dan Nissenbaum]:

Par convention, les fichiers .hpp sont utilisés lorsque les prototypes sont définis dans l'en-tête 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, si elles ne sont pas définies dans les fichiers d'en-tête, leurs définitions ne seront pas résolues au moment de la liaison avec d'autres unités de compilation. Si votre projet est un projet C ++ uniquement qui utilise beaucoup de modèles, cette convention peut être utile.

Certaines bibliothèques de modèles qui adhèrent à cette convention fournissent des en-têtes avec des extensions .hpp pour indiquer qu'ils n'ont pas de fichiers .cpp correspondants.

Certaines autres bibliothèques de modèles utilisent une autre convention, comme l'utilisation de .h pour les en-têtes C et de .hpp pour C ++; un bon exemple serait la bibliothèque boost.

Citation de Boost FAQ,

Les extensions de fichiers communiquent le "type" du fichier, à la fois aux humains   et aux programmes informatiques. L'extension '.h' est utilisée pour l'en-tête C   fichiers, et communique donc la mauvaise chose à propos de l'en-tête C ++   des dossiers. N'utiliser aucune extension ne communique rien et force l'inspection   du contenu du fichier pour déterminer le type. Utiliser '.hpp' sans ambiguïté   l'identifie comme fichier d'en-tête C ++ et fonctionne bien dans la pratique.   (Rainer Deyke)


19
2017-12-03 12:08



Peu importe quelle extension vous utilisez. L'un ou l'autre est OK.

j'utilise *.h pour C et *.hpp pour C ++.


18
2017-09-30 10:48



J'ai récemment commencé à utiliser *.hpp pour les en-têtes c ++.

La raison en est que j'utilise emacs comme éditeur principal et qu'il entre automatiquement en mode c lorsque vous chargez un *.h fichier et en C ++ - mode lorsque vous chargez un *.hpp fichier.

En dehors de cela, je ne vois aucune bonne raison de choisir *.h plus de *.hpp ou vice versa.


9
2017-09-30 11:28



Dans l'un de mes travaux au début des années 90, nous avons utilisé .cc et .hh pour les fichiers source et d'en-tête respectivement. Je préfère encore toutes les alternatives, probablement parce que c'est plus facile à taper.


5
2017-09-30 11:15



Je préfère que .hpp pour C ++ indique clairement 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.


5
2017-09-30 14:15



Vous pouvez appeler votre inclut ce que vous voulez.

Juste besoin de spécifier ce nom complet dans le #include.

Je suggère que si vous travaillez avec C pour utiliser .h et quand avec C ++ à utiliser .hpp.

C'est finalement une convention.


5
2017-09-30 10:51