Pourquoi avoir des fichiers d'en-tête .fichiers cpp?
Pourquoi est-ce que C++ ont fichiers d'en-tête .fichiers cpp?
- Question connexe: " stackoverflow.com/questions/1945846/...
- c'est un paradigme de la programmation orientée objet,.h est une déclaration de classe et du rpc étant la définition.On n'a pas besoin de savoir comment il est mis en œuvre,il/elle doit seulement connaître l'interface.
- C'est la meilleure partie de c++ en séparant l'interface de mise en œuvre. Il est toujours bon plutôt que de garder tout le code dans le fichier unique, nous avons une interface séparée. Une certaine quantité de code sont toujours là comme fonction inline, qui font partie des fichiers d'en-tête. Regarde bien quand un fichier d'en-tête est considérée affiche la liste des fonctions déclarées et les variables de classe.
Vous devez vous connecter pour publier un commentaire.
Bien, la raison principale serait pour la séparation de l'interface à partir de la mise en œuvre. L'en-tête déclare "que" d'une classe (ou tout ce qui est en cours de mise en œuvre) de le faire, alors que le fichier cpp définit le "comment", il va effectuer ces fonctions.
Cela réduit les dépendances de sorte que le code qui utilise l'en-tête n'a pas nécessairement besoin de connaître tous les détails de la mise en œuvre et de toutes les autres classes et/ou les en-têtes nécessaires que pour que. Cela permettra de réduire les temps de compilation et aussi le montant de la recompilation nécessaire lorsque quelque chose dans la mise en œuvre des changements.
Il n'est pas parfait, et vous aurait généralement recours à des techniques comme le Pimpl Idiome de bien séparer l'interface et la mise en œuvre, mais c'est un bon début.
La compilation C++
Une compilation en C++ se fait en 2 phases principales:
La première est la compilation de "source", des fichiers texte en binaire "objet" des fichiers: Le fichier CPP est le fichier compilé et est compilé sans connaître les autres fichiers CPP (ou même les bibliothèques), à moins que la fed biais de la crue de la déclaration ou de l'en-tête de l'inclusion. Le fichier CPP est généralement compilé dans un .OBJ ou .O "objet" fichier.
Le second est le lien entre tous les "objets" des fichiers, et donc, la création de la finale de fichier binaire (soit une bibliothèque ou d'un fichier exécutable).
D'où vient la centrale de tenir dans tout ce processus?
Un pauvre solitaire d'un fichier CPP...
La compilation de chaque fichier CPP est indépendant de tous les autres fichiers CPP, ce qui signifie que si A.CPP besoin d'un symbole défini dans B.CPP comme par exemple:
Il ne compile pas car A.CPP n'a aucun moyen de savoir "doSomethingElse" existe... à Moins qu'il y est une déclaration A.CPP comme par exemple:
Alors, si vous avez C.CPP qui utilise le même symbole, ensuite, vous copiez/collez la déclaration...
COPIER/COLLER ALERTE!
Oui, il y a un problème. Copie/colle sont dangereux et difficile à maintenir. Ce qui signifie que ce serait cool si on avait une certaine façon de ne PAS copier/coller, et continuent à déclarer le symbole... Comment pouvons-nous le faire? Par l'include d'un fichier texte, qui est communément suffixé par .h, .hxx, .h++ ou, mon préféré pour les fichiers C++, .hpp:
Comment
include
travail?Y compris un fichier, en substance, d'analyser puis de copier-coller son contenu dans le fichier CPP.
Par exemple, dans le code suivant, avec l'A. HPP-tête:
... la source B.CPP:
... deviendra après l'inclusion:
Une petite chose - pourquoi inclure B. HPP dans B.CPP?
Dans le cas actuel, il n'est pas nécessaire, et B. HPP a la
doSomethingElse
déclaration de la fonction, et B.CPP a ladoSomethingElse
définition de la fonction (qui est, par elle-même une déclaration). Mais dans un cas plus général, où B. PHP est utilisé pour les déclarations (et code en ligne), il n'y aurait pas de définition correspondant (par exemple, les énumérations, de la plaine aux structures, etc.), donc l'inclure pourraient être nécessaires si B.CPP utilise ceux de la déclaration de B. HPP. Dans l'ensemble, il est "de bon goût" pour une source d'inclure par défaut son en-tête.Conclusion
Le fichier d'en-tête est donc nécessaire, parce que le compilateur C++ est incapable de recherche de symbole déclarations seul, et vous devez donc l'aider en incluant ces déclarations.
Un dernier mot: Vous devriez mettre de l'en-tête des gardes autour du contenu de votre PHP les fichiers, pour être sûr de multiples inclusions de ne pas casser quelque chose, mais dans l'ensemble, je crois que la raison principale de l'existence de PHP des fichiers est expliqué ci-dessus.
foo(bar)
, vous ne pouvez même pas être sûrfoo
est une fonction. Ainsi, le compilateur doit avoir accès aux informations dans les en-têtes de décider si la source compile correctement, ou pas... Ensuite, une fois que le code est compilé, l'éditeur de liens tout lien entre l'ensemble des appels de fonctions.Seems, they're just a pretty ugly arbitrary design.
: Si le C++ a été créé en 2012, en effet. Mais n'oubliez pas de C++ a été construit sur C dans les années 1980, et à l'époque, les contraintes sont très différentes à l'époque (autant que je me souvienne, il a été décidé pour des fins d'adoption, pour garder le même linkers que C est).foo(bar)
est une fonction - si il est obtenu comme un pointeur? En fait, en parlant de mauvaise conception, je blâme C, pas du C++. Je n'aime vraiment pas certaines contraintes de pure C, comme avoir des fichiers d'en-tête ou ayant des fonctions de retour d'une et une seule valeur, tout en prenant de multiples arguments sur l'entrée (n'est-ce pas quelque chose de naturel pour avoir l'entrée et la sortie se comportent d'une manière similaire; pourquoi plusieurs arguments, mais une seule sortie?) 🙂In fact, speaking of bad design, I blame C, not C++
: Je peux blâmer C pour beaucoup de choses, mais ayant été conçu dans les années 70 ne pas être l'un d'eux. Encore une fois, les contraintes de l'époque...such as having header files or having functions return one and only one value
: les Tuples peuvent aider à atténuer la situation, ainsi que le passage d'arguments par référence. Maintenant, quelle serait la syntaxe pour récupérer retourné plusieurs valeurs, et serait-il la peine de changer la langue?Parce que C, où le concept est originaire, est de 30 ans, et à l'époque, c'était le seul moyen viable de réunir le code à partir de plusieurs fichiers.
Aujourd'hui, c'est un sacré hack qui a totalement détruit le temps de compilation en C++, les causes d'innombrables inutile dépendances (parce que les définitions de classe dans un fichier d'en-tête de l'exposer trop d'informations sur la mise en œuvre), et ainsi de suite.
Parce qu'en C++, le code exécutable final ne portent pas le symbole de l'information, c'est plus ou moins pure du code machine.
Donc, vous avez besoin d'un moyen de décrire l'interface d'un morceau de code, qui est distinct du code lui-même. Cette description se trouve dans le fichier d'en-tête.
Parce que le C++ héritées C. Malheureusement.
Parce que les gens qui ont conçu la bibliothèque de format n'est pas pour les "déchets" de l'espace pour les très rarement utilisé des informations comme le préprocesseur C macros et les déclarations de fonction.
Car vous avez besoin de cette info pour dire à votre compilateur "cette fonction n'est disponible que plus tard, lorsque l'éditeur de liens est en train de faire son travail", ils ont dû venir avec un deuxième fichier où ce partage d'informations pourraient être stockées.
La plupart des langues après le C/C++ de stocker cette information dans la sortie (le bytecode Java, par exemple) ou qu'ils n'utilisent pas un fichier de format, toujours distribué sous forme de code source et le compiler à la volée (Python, Perl).
C'est le préprocesseur façon de déclarer des interfaces. Vous mettez l'interface (déclarations de méthode) dans le fichier d'en-tête, et la mise en œuvre dans le rpc. Applications à l'aide de votre bibliothèque seulement besoin de savoir l'interface, auxquels ils peuvent accéder par l'intermédiaire de #include.
Souvent, vous voulez avoir une définition d'une interface sans avoir à expédier l'ensemble du code. Par exemple, si vous avez une bibliothèque partagée, vous expédier un fichier d'en-tête avec elle qui définit toutes les fonctions et les symboles utilisés dans la bibliothèque partagée. Sans les fichiers d'en-tête, vous devez envoyer le source.
Sein d'un même projet, les fichiers d'en-tête sont utilisés, à mon humble avis, pour au moins deux raisons:
De répondre à MadKeithV réponse,
Une autre raison est qu'un en-tête donne un id unique à chaque classe.
Donc, si nous avons quelque chose comme
Nous allons avoir des erreurs, lorsque nous essayons de construire le projet, puisque A est une partie de B, avec les en-têtes de nous éviter ce genre de maux de tête...