Ce qui devrait aller dans une .h fichier?
Lors de la division de votre code dans plusieurs fichiers juste exactement ce que devrait aller dans une .h de fichier et de ce qu'il devrait aller dans une .fichier cpp?
- Question connexe: stackoverflow.com/questions/333889/...
- C'est une pure question de style, mais je crois que C++ déclarations aller dans un
.hpp
fichier alors que C des déclarations d'aller dans un.h
fichier. Ceci est très utile lors du mélange de code C et C++ (par exemple les anciens modules en C). - Du sens. C'est que la pratique souvent utilisée?
- Oui, la pratique est souvent utilisé, en particulier lors du mélange de C++ et de C langues.
Vous devez vous connecter pour publier un commentaire.
Fichiers d'en-tête (
.h
) sont conçus pour fournir les informations qui seront nécessaires dans plusieurs fichiers. Des choses comme les déclarations de classe, les prototypes de fonction, et les énumérations généralement d'aller dans les fichiers d'en-tête. En un mot, "définitions".Fichiers de Code (
.cpp
) sont conçues pour assurer la mise en œuvre de l'information qui ne doit être connue dans un fichier. En général, le corps des fonctions et des variables internes qui devrait/ne sera jamais accessible par d'autres modules, ce sont appartenir à.cpp
fichiers. En un mot, "les implémentations".La plus simple question à vous poser afin de déterminer ce qui appartient là où il est "si je change ce, vais-je avoir à modifier le code dans d'autres fichiers pour rendre les choses compiler à nouveau?" Si la réponse est "oui", il appartient probablement dans le fichier d'en-tête; si la réponse est "non", il appartient probablement dans le fichier de code.
export
). Le seul moyen autour de #1 est PIMPL. #2 serait possible siexport
a été pris en charge et sera peut-être possible à l'aide de c++0x etextern
modèles. L'OMI, de l'en-tête des fichiers en c++ perdent beaucoup de leur utilité.Fait est que, en C++, c'est un peu plus compliqué que les en-tête C/organisation de la source.
Que fait le compilateur voir?
Le compilateur voit une grande source (.rpc) fichier de avec ses en-têtes inclus. Le fichier source est l'unité de compilation qui sera compilé dans un fichier objet.
Alors, pourquoi est-têtes nécessaires?
Parce qu'une unité de compilation pourrait avoir besoin d'informations sur la mise en œuvre dans une autre unité de compilation. Donc, on peut écrire par exemple la mise en œuvre d'une fonction à une seule source, et écrire la déclaration de cette fonction dans une autre source ayant besoin de l'utiliser.
Dans ce cas, il existe deux copies de la même information. Qui est le mal...
La solution est de partager quelques détails. Alors que la mise en œuvre doit rester dans la Source, la déclaration du partage des symboles, comme des fonctions ou de la définition de structures, classes, les énumérations, etc., pourrait avoir besoin d'être partagé.
Les en-têtes sont utilisés pour mettre ceux partagé des détails.
Déplacer à l'en-tête les déclarations de ce que doivent être partagées entre plusieurs sources
Rien de plus?
En C++, il y a quelques autres choses qui pourraient être mis dans l'en-tête parce que, ils doivent, eux aussi, être partagé:
Déplacer vers la tête de TOUT ce qui doit être partagé, y compris partagé implémentations
T-il à dire alors qu'il pourrait y avoir des sources à l'intérieur de l'en-tête?
Oui. En fait, il ya beaucoup de choses différentes qui pourraient être à l'intérieur d'un "en-tête" (c'est à dire partagé entre les sources).
Cela devient compliqué, et dans certains cas (les dépendances circulaires entre les symboles), impossible de le garder dans l'en-tête.
En-têtes peut être décomposé en trois parties
Cela signifie que, dans un cas extrême, vous pourriez avoir:
Imaginons que nous avons basé sur un modèle MyObject. Nous pourrions avoir:
.
.
.
Wow!
Dans la "vraie vie", il est généralement moins compliqué. La plupart du code aura seulement un simple en-tête/source de l'organisation, avec quelques inline code dans la source.
Mais dans d'autres cas (basé sur un modèle d'objets de savoir les uns des autres), j'ai dû avoir pour chaque objet séparé de déclaration et de mise en œuvre des en-têtes, avec un vide de source y compris ceux en-têtes pour m'aider à voir quelques erreurs de compilation.
Une autre raison pour briser les en-têtes dans un en-tête différent pourrait être pour accélérer la compilation, la limitation de la quantité de symboles analysée au strict nécessaire, et en évitant d'inutiles recompilation d'une source qui ne s'occupe que de la déclaration anticipée lorsqu'une ligne de la méthode de la mise en œuvre changé.
Conclusion
Vous devriez faire de votre code d'organisation à la fois aussi simple que possible, et aussi modulaire que possible. Mettre autant que possible dans le fichier source. Seulement exposer dans les en-têtes de ce qui doit être partagée.
Mais le jour où vous aurez circulaire dépendances entre basé sur un modèle d'objets, ne soyez pas surpris si votre code d'organisation devient un peu plus "intéressant" que la plaine en-tête/organisation de la source...
^_^
en plus de toutes les autres réponses, je vais vous dire ce que vous NE les placez PAS dans un fichier d'en-tête:
using
déclaration (la plus courante étantusing namespace std;
) ne devrait pas figurer dans un fichier d'en-tête parce qu'ils polluent l'espace de noms du fichier source dans lequel il est inclus.using
à apporter des trucs dans l'espace de noms global dans un en-tête.static inline
en C99, à cause de quelque chose à faire avec ce qui arrive lorsque vous combinez une liaison interne avec des modèles. Anon espaces de noms laissez-vous "cacher" des fonctions, tout en préservant la liaison externe.Ce compile en rien (zéro binaire de l'empreinte) va dans le fichier d'en-tête.
Variables ne compile pas en rien, mais les déclarations de type n' (coz ils ne décrivent comment les variables de comportement).
fonctions ne sont pas, mais les fonctions inline faire (ou macros), parce qu'ils produisent du code que là où il est appelé.
modèles ne sont pas de code, ils ne sont qu'une recette pour la création de code. donc, ils vont aussi dans les h des fichiers.
En général, vous mettez les déclarations dans le fichier d'en-tête et les définitions dans la mise en œuvre (.rpc) fichier. L'exception à cela est des modèles, où la définition doit aussi aller dans l'en-tête.
Cette question et celles de similaire il a été demandé fréquemment sur SOI - voir Pourquoi avoir des fichiers d'en-tête .fichiers cpp en C++? et C++ Fichiers D'En-Tête, Séparation De Code par exemple.
Votre classe et les déclarations de fonction en plus de la documentation, et les définitions pour les fonctions/méthodes (bien que certains préfèrent mettre en séparer .inl fichiers).
Principalement de l'en-tête du fichier contient des squelette de classe ou déclaration (ne change pas fréquemment)
et fichier cpp contient implémentation de la classe (changements fréquents).
le fichier d'en-tête (.h) devrait être pour les déclarations de classes, des structures et de ses méthodes, prototypes, etc. La mise en œuvre de ces objets sont fabriqués en rpc.
dans .h
Je m'attends à le voir:
vraiment la réponse mais est ce que de ne pas mettre dans:
L'en-tête Définit quelque chose, mais ne dit rien au sujet de la mise en œuvre. ( À l'exclusion des Modèles dans cette "metaforemc".
Avec cela dit, vous devez répartir les "définitions" en sous-groupes, il y a, dans ce cas, deux types de définitions.
Maintenant, je veux bien sur parler le premier sous-groupe.
L'en-tête est là pour définir la mise en page de votre structure afin d'aider le reste de l'utilisation du logiciel, la mise en œuvre. Vous pourriez le voir comme une "abstraction" de votre mise en œuvre, qui est vaughly dit, mais, je pense que cela correspond assez bien dans ce cas.
Comme les précédentes affiches ont dit et montré, vous déclarez privé et public, les domaines d'utilisation et leurs en-têtes, ce qui inclut également privés et publics des variables. Maintenant, je ne veux pas entrer dans la conception du code ici, mais, vous pourriez envisager ce que vous mettez dans vos têtes, parce que c'est la Couche entre l'utilisateur final et la mise en œuvre.
En-tête (.h)
Corps (.rpc)
En règle générale, vous mettez le "partage" de la partie du module sur le .h (la partie que d'autres modules doit être en mesure de voir) et le "non partagé" de la partie sur le .rpc
PD: Oui, j'ai inclus des variables globales. J'ai utilisé quelques fois et il est important de ne pas les définir sur les en-têtes, ou vous aurez beaucoup de modules, chacun de définir sa propre variable.
EDIT: Modifié d'après le commentaire de David