Question

Je ne comprends pas tout à fait le point d'avoir un en-tête; il semble violer le principe SEC! Toutes les informations contenues dans un en-tête est (peut être) contenue dans la mise en œuvre.

Était-ce utile?

La solution

Il simplifie le processus de compilation. Lorsque vous voulez compiler indépendamment des unités, vous besoin de quelque chose pour décrire les parties qui seront liées à sans avoir à importer l'intégralité de tous les autres fichiers.

Il permet également de se cacher de code. On peut distribuer un en-tête pour permettre aux autres d'utiliser la fonctionnalité sans avoir à distribuer la mise en œuvre.

Enfin, il peut encourager la séparation de l'interface de mise en œuvre.

Ils ne sont pas la seule façon de résoudre ces problèmes, mais il y a 30 ans, ils étaient un bon. Nous aurions probablement pas utiliser les fichiers d'en-tête pour une langue aujourd'hui, mais ils ont pas été inventées en 2009.

Autres conseils

Les architectes de nombreuses langues modernes tels que Java, Eiffel et C # sont d'accord clairement avec vous - ces langues extraient les métadonnées d'un module de la mise en œuvre. Cependant, en soi, le concept des en-têtes ne fait pas obstacle à ce que - il serait évidemment une tâche simple pour un compilateur pour extraire un fichier .h lors de la compilation d'un .c, par exemple, tout comme les compilateurs pour les autres langues font implicitement. Le fait que les compilateurs actuels typiques C ne le font pas ne sont pas un problème de conception linguistique - il est une question de mise en œuvre; apparemment il n'y a pas de demande par les utilisateurs pour une telle fonction, donc aucun fournisseur de compilateur embête sa mise en œuvre.

En tant que choix de conception de la langue, avoir des fichiers .h séparés (dans un format texte humain lisible et modifiable) vous donne le meilleur des deux mondes: vous pouvez commencer à compiler séparément code client basé sur une implémentation du module qui n'existe pas encore , si vous le souhaitez, en écrivant le fichier .h à la main; ou vous (en supposant par une absurde mise en œuvre du compilateur qui l'alimente ;-) peut obtenir le fichier .h automatiquement à partir de la mise en œuvre comme un effet secondaire de le compiler.

Si C, C ++, etc., garder en plein essor (apparemment, ils font encore bien aujourd'hui ;-), et la demande comme la vôtre pour l'écriture pas manuellement les en-têtes grandit, finalement compilateur écrivains devront fournir l'option « génération d'en-tête », et le « meilleur des deux mondes » ne restera pas théorique -)

Il aide à réfléchir un peu sur les capacités des ordinateurs qui étaient disponibles lorsque, par exemple c, a été écrit. La mémoire principale a été mesurée en kilowords, et pas nécessairement un très grand nombre d'entre eux. Les disques étaient plus gros, mais pas beaucoup. stockage Serrious signifiait bandes bobine à bobine, montés à la main, par les opérateurs grincheux, qui vous vraiment envie d'aller loin pour qu'ils puissent jouer le chasse wumpus. Une machine à 1 MIPS était rapide crier . Et avec toutes ces limitations que vous aviez à partage il. Peut-être avec une vingtaine d'autres utilisateurs.

Tout ce qui réduit l'espace ou complexité du moment de la compilation a été une grande victoire. Et les en-têtes font les deux.

Ne pas oublier la documentation fournit un en-tête. Il y a habituellement quelque chose dans ce que vous devez savoir pour utiliser le module. Pour ma part, ne veux pas parcourir une très longue sourcecode pour apprendre ce qu'il est que je dois utiliser et comment l'appeler ... Vous extrairaient cette information de toute façon, ce qui se traduit efficacement - un fichier d'en-tête. Plus un problème avec IDEs moderne, bien sûr, mais travailler avec un vieux code C J'aime vraiment avoir des fichiers d'en-tête faits à la main qui incluent des commentaires sur l'utilisation et sur pré et postconditions.

Garder la source, en-tête et de la documentation supplémentaire de synchronisation est encore une autre boîte de Pandore ...

L'idée d'inspecter les fichiers binaires de sortie des processeurs de langage aurait été difficile à comprendre quand C inventé les fichiers .h. Il y avait un système appelé JOVIAL qui a fait quelque chose comme ça, mais il était exotique et confiné plus- ou moins exclusivement à des projets militaires. (Je ne l'ai jamais vu un programme JOVIAL, je ne l'ai entendu parler.)

Alors, quand C est sorti le modèle de conception habituelle de modularité était « aucun contrôle d'aucune sorte ». Il pourrait y avoir une restriction .TEXT symboles seul lien pourrait à .TEXT et .data à .DATA, mais était-ce. Autrement dit, les compilateurs du jour généralement traités un fichier source à un moment, puis linkers les mettre ensemble sans le moindre niveau d'erreur de vérification autre que, si vous avez de la chance, « Je suis un symbole de fonction » vs « Je suis un symbole de données ».

L'idée d'avoir fait le compilateur comprendre la chose que vous appeliez était un peu nouveau.

Aujourd'hui encore, si vous faites une tête totalement faux, personne ne vous attrape dans la plupart AOT compilateurs . choses intelligentes comme les langages CLR et Java font réellement les choses dans les fichiers encodent de classe.

Alors oui, à long terme, nous allons probablement pas les fichiers d'en-tête.

Non, vous n'avez pas les en-têtes en Java - mais vous avez des interfaces et moi chaque gourou sérieux Java vous recommande de définir quoi que ce soit utilisé par d'autres projets / systèmes d'interface et une implémentation

.

Permet de voir une définition interface java contient les signatures d'appel, les définitions de type et Constantes.

La plupart des fichiers d'en-tête C contiennent des signatures appel, définitions de type et constantes.

Donc, pour toutes fins C pratical / C fichiers d'en-tête ne sont que des définitions d'interface et doivent donc être considérés comme une bonne chose. Maintenant, je sais que possible de définir une myriade d'autres choses dans les fichiers d'en-tête et (MARCROs, constantes, etc., etc.), mais que seulement une partie de l'ensemble du monde merveilleux de C: -

int function target () {
    // Default for shoot
    return FOOT;
}

Pour plus de détails Lire cette

Un fichier d'en-tête contient généralement en avant les déclarations de classes, sous-routines, variables et autres identifiants. Les programmeurs qui souhaitent déclarer des identificateurs normalisés dans plus d'un fichier source peuvent placer ces identifiants dans un seul fichier d'en-tête, quel autre code peut alors inclure chaque fois que le contenu d'en-tête sont nécessaires.

La bibliothèque standard C et bibliothèque standard C de déclarer traditionnellement leurs fonctions standard dans les fichiers d'en-tête.

Et si vous voulez donner à quelqu'un d'autre les déclarations d'utiliser votre bibliothèque sans leur donner la mise en œuvre?

Comme une autre réponse souligne - la raison initiale des en-têtes était de rendre l'analyse syntaxique / compilation plus facile sur des plates-formes avec des outils très simples et limités. Ce fut un grand pas en avant d'avoir une machine avec 2 disques souples pour que vous puissiez avoir le compilateur sur un seul et votre code sur les autres -. Choses fait beaucoup plus facile

Lorsque vous divisez le code dans les fichiers d'en-tête et à la source diviser déclaration et définition. Quand vous regardez dans les fichiers d'en-tête, vous pouvez voir ce que vous avez et si vous baguette pour voir les détails de mise en œuvre que vous allez à fichier source.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top