Partage
  • Partager sur Facebook
  • Partager sur Twitter

Que ce qu'un header ou fichier.h

Question de novice

Sujet résolu
    27 août 2013 à 1:59:26

    Bonsoir, je ne suis qu'un novice en programmation et je me demande ce qu'est un fichier header, en quoi est t'il utile au fichier.cpp, quel est sa fonction ?  Merci.

    • Partager sur Facebook
    • Partager sur Twitter
      27 août 2013 à 8:27:14

      Lu'!

      Il sert à nous dire ce qu'on peut utiliser et qui vient du fichier.cpp correspondant quand on l'inclut.

      Il a deux principales utilités :

      • fournir un aperçu rapide du contenu d'un source histoire de s'y retrouver plus rapidement.
      • et surtout alléger ma compilation (si on ne s'y prend pas comme un manche).
      • il n'y a pas de point 3.

      1) Pour l'instant, pour toi, il doit avoir l'air rébarbatif et inutile, tu dois avoir peu de fonctions et, de manière générale, peu de lignes de code. Mais dans un projet immense, outre la documentation, avoir l'accès à un fichier header quand on a besoin du prototype d'une fonction vite fait c'est très pratique.

      2) Quand tu fais #include "toto.h", la ligne est remplacée par le contenu entier du fichier toto.h, et s'il y a d'autres include dans toto.h, c'est la même chose. Cela veut dire que partout où tu as besoin de toto.h, cela sera fait. Maintenant, imagine qu'on ait pas de header, il peut se passer deux choses pour que ça fonctionne :

      • soit tu inclus les codes source (cpp) au lieu des headers : si a.cpp, b.cpp et c.cpp ont besoin de utile.cpp, il récupéreront chaque fois tout le code, tu vas compiler le contenu de utile.cpp trois fois.
      • soit ton compilateur crées une liste géante de tout ce qu'il a en la faisant grossir au fur et à mesure de la compilation, et à chaque appel de fonction, il doit la rechercher dans cette liste pour vérifier qu'elle existe. Et ça pour tout les fichiers, et dans le bon ordre parce que sinon il va apparaître des objets non-déclarés. Ce serait le gros foutoir.

      C'est pour ça que les header c'est le bien, ça dit à ton compilateur : "il existe toutes ces choses là, tu ne les connais pas pour l'instant, mais pas d'inquiétude, tu sauras en temps voulu".

      3) J'ai dit qu'il n'y avait pas de point 3.

      -
      Edité par Ksass`Peuk 27 août 2013 à 8:27:53

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        27 août 2013 à 10:45:40

        Ksass pour le coup je pense que t'as raté un truc s'il est novice, ré-expliquer maybe la compilation séparée.

        Donc SP94500, t'en est au chapitre de la compilation séparée.

        C'est une technique qui permet de compiler plusieurs parties d'un programme de façon... séparée comme son nom l'indique. Le compilateur vas produire un fichier contenant du code executable pour chaque fichier .cpp (des .o) . Sauf que tous seuls, ces fichiers sont inutilisables. Il va donc falloir tous les assembler et faire les liens entre eux afin de produire un executable complet, ça s'appelle l'edition des liens.

        On va prendre un exemple simple : tu as 3 fichiers .cpp :

        • operations.cpp : contient les fonctions addition(...) et soustraction(...)
        • calcul.cpp : contient la fonction calcul(...) qui, en fonction des paramètres d'entrée, va se charger d'appeler addition ou soustraction
        • main.cpp : qui fera appel à calcul.

        Du point de vue operations.cpp :

        operations.cpp ne fait pas appel à des fonctions situées dans d'autres fichiers.

        Pour les besoins de l'exemple, la fonction soustraction fais appel à addition en prenant simplement l'opposé du paramètre à soustraire + (- a ) = - a .

        Lorsque le fichier operations.cpp est compilé, le compilateur tombe sur addition(...) dans le code de soustraction. Il a besoin de connaitre la signature de cette fonction, pour vérifier que l'appel est correct. Ca tombe bien, on a déclaré la fonction juste avant. Le compilateur as donc toutes les informations nécessaires.

        Du point de vue calcul.cpp : lorsque calcul.cpp est compilé, il faut vérifier les appels à addition(...) et soustraction(...) . Pour cela le compilateur as besoin de la signature de la fonction : le type de retour, le nom de la fonction, et le type de ses paramètres. Il peut ainsi vérifier que les fonctions sont appelées correctement; sortir une erreur si par exemple on utilise des paramètres de mauvais type etc... et ces Informations se situent normalement dans operations.h . calcul.cpp doit donc inclure operations.h

        Du point de vue main.cpp , on utilise la fonction calcul. Pareil qu'au dessus, on a besoin des informations sur cette fonction, on inclus donc calcul.h .

        Maintenant, on as trois fichiers compilés : main.o, calcul.o, operations.o . Il reste à réunir ces trois fichiers pour produire notre executable final. L'editeur des liens vas se charger de rattacher l'appel de calcul(...) dans le fichier main.o, au véritable code situé dans calcul.o . Si jamais il ne trouve pas le code en question, il produira une erreur. Ceci peut arriver quand on écris le prototype d'une fonction dans un .h mais qu'on ne l'écris dans aucun .c .

        Les avantages de la compilation séparée :

        • Diviser le code en plusieurs parties plus petites et humaines
        • Ne pas recompiler tout le projet à chaque fois. On peut dire au compilateur de ne compiler un fichier .cpp seulement si il n'y a pas de .o associé ou que la date de modification du .o est plus ancienne que la date de modification du .cpp associé, ce qui signifierait qu'un fichier .cpp ait été modifié après sa dernière compilation.
        • ... je ne les ai pas en tête

        Attention : lorsqu'on modifie seulement un .h, les fichiers l'utilisant de sont pas recompilés. On peut donc se dire que les modifications ne sont pas prises en compte. Et comme on ne peut pas savoir quels sont les fichiers .cpp qui incluent directement ou indirectement le .h ... Il faut clean (supprimer tous les .o) le projet et recompiler tous les fichiers.

        -
        Edité par Cytosol 27 août 2013 à 10:51:01

        • Partager sur Facebook
        • Partager sur Twitter
          27 août 2013 à 18:18:15

          Merci pour l'enseignement, si je comprend bien le fichier.h permet de simplifier non seulement le développement et la compilation mais aussi de permettre une lecture plus simple du code mais le fichier.h est généré automatiquement ou faut t'il le faire soi-même ? Comment ça marche ?
          • Partager sur Facebook
          • Partager sur Twitter
            27 août 2013 à 18:25:03

            Il faut l'écrire soit même. Cela te permet entre autre d'avoir les idées claires sur ce que tu fais mais également de pouvoir cacher certaines fonctionnalités internes. Si une fonction n'est définie que dans le cpp mais pas dans le header, elle est indisponible à l'extérieur.
            • Partager sur Facebook
            • Partager sur Twitter

            Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

            Que ce qu'un header ou fichier.h

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown