IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

inclusion dans le .h ou le .c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut inclusion dans le .h ou le .c
    Bonjour,

    Quelqu'un m'a demandé de lui expliquer où doit on mettre les inclusions et pourquoi cette solution est la mieux. J'ai répondu instinctivement que le mieux est de tout mettre dans le .c comme ça le préprocesseur recopie tout dans le même fichier et que c'est mieux. mais au moment de lui expliquer pourquoi je me suis mélangé les pinceaux.

    Si j'ai les fichiers suivants fic1.c, fic1.h, fic2.c, fic2.h, est-il mieux d'inclure fic2.h dans fic1.h ou de l'inclure dans fic1.c, et si fic1.c, pourquoi c'est mieux ? A priori le préprocesseur finirait quand même par tout mettre dans le fic1.c s'il allait chercher le contenu de fic2.h à travers fic1.h, puisque la directive incluant le fic1.h ramènerait les données au final dans fic1.c non ?


    A L'AIIIIDEEE !!

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et tu es "ingénieur études et développement" ???

    les *h sont des fichiers qui en général servent à définir les interfaces (API) des fonctions à usage externe du fichier .c correspondant.

    Si f2.c à besoin de quelques fonctions de f1.c, la définition de ces fonctions (leur prototype) sera mise dans f1.h, et f2.c incluera f1.h, et ainsi de suite.. (par exemple strings.h ou sdtlib.h pour la biblothèque standard)

    Sinon, les .h peuvent aussi être utilisés pour définir des types ou valeurs dont l'usage est réparti dans plusieurs fichiers .c (par exemple limits.h pour la biblothèque standard)

  3. #3
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    et tu es "ingénieur études et développement" ???
    et je ne sais pas tout, et il m'arrive même très souvent de douter de ce que je sais .... étonnant ? si vous savez tout sur tout et que vous ne remettez jamais en cause vos connaissances les plus basiques, tant mieux pour vous.

    Citation Envoyé par souviron34 Voir le message
    les *h sont des fichiers qui en général servent à définir les interfaces (API) des fonctions à usage externe du fichier .c correspondant.
    Ok, mais ça répond pas à ma question

    Citation Envoyé par souviron34 Voir le message
    Si f2.c à besoin de quelques fonctions de f1.c, la définition de ces fonctions (leur prototype) sera mise dans f1.h, et f2.c inclura f1.h, et ainsi de suite.. (par exemple strings.h ou sdtlib.h pour la biblothèque standard)
    Ok, mais ça répond pas à ma question, et c'est ce que j'ai répondu à la personne qui m'a questionné, mais POURQUOI est-ce mieux que f2.c inclut f1.h, alors que : f2.c inclut f1.h qui inclut f2.h fonctionne aussi apparemment ?

    Citation Envoyé par souviron34 Voir le message
    Sinon, les .h peuvent aussi être utilisés pour définir des types ou valeurs dont l'usage est réparti dans plusieurs fichiers .c (par exemple limits.h pour la biblothèque standard)
    Génial, mais ça répond pas à ma question...

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Ok, mais ça répond pas à ma question, et c'est ce que j'ai répondu à la personne qui m'a questionné, mais POURQUOI est-ce mieux que f2.c inclut f1.h, alors que : f2.c inclut f1.h qui inclut f2.h fonctionne aussi apparemment ?


    Génial, mais ça répond pas à ma question...
    Sauf qu'on ne sait pas quelle est ta question

    Tu ne nous donnes pas les caractéristiques des fichiers concernés...


    Dans l'absolu, ce que j'ai dit répond à ta question :

    un .h inclue les prototypes des fonctions dont on a besoin à l'extérieur..

    POINT FINAL


    Si un fichier f1.h inclut f2.h, c'est que f1.c devrait avoir besoin de certaines fonctions de f2.c.

    Mais si f2.c inclut f1.h qui inclut f2.h, c'est une erreur de conception....

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Si, dans un fichier d'entête, tu déclares une fonction qui utilise dans sont interface un type de donnée comme par exemple size_t (mais c'est valable pour n'importe quel type de donnée), tu inclus le fichier d'entête qui convient directement dans ton propre fichier .h. Ici, par exemple, tu inclus stddef.h directement dans ton fichier .h. Ce ne sera pas au code client de le faire.

    Si, dans un fichier d'implantation, tu utilises une structure de donnée, macro ou fonction définie dans une autre unité de compilation, tu inclus le fichier d'entête qu'il faut dans ton fichier d'implantation .c.

    La règle de base est relativement simple: il faut inclure le fichier d'entête qui convient à l'endroit où les déclarations qu'il contient sont utilisées.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Pour précsier encore plus, le principe de fond est le plus petit dénominateur commun :

    1. soit un fichier f1.c contenant les fonctions A, B, et C.

    2. soit un fichier f2.c contenant les fonctions D et E

    3. D se sert de A, E se sert de B. C est d'usage interne à f1.c (utilisée par A ou B)

    4. f1.c ET f2.c ont besoin de la définition d'une structure s, et d'une valeur commune LIM



    • Pour satisfaire le point 3, il faut avoir un fichier f1.h contenant A et B seulement, qui doit être inclus dans f2.c

    • Pour satisfaire le point 4, il faut avoir un autre fichier .h (par exemple "common.h" ou "structs.h") contenant la définition de s et de LIM seulement, qui doit être inclus dans f1.c ET dans f2.c



    Si malgré tout il existe dans f2 des fonctions qui sont nécessaires à f1, c'est que la conception est mal faite, et qu'il fallait faire (éventuellement) un troisième fichier f3, ou regrouper les fonctions au sein du même fichier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Ressources] Nombre de ressources incluses dans un fichier
    Par Clorish dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 03/06/2005, 15h27
  2. inclus ou pas inclus dans delphi 2005
    Par lopezpacheco dans le forum Débuter
    Réponses: 4
    Dernier message: 11/02/2005, 00h43
  3. [struts][jsp]Inclusion dans une jsp
    Par GreenJay dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 17/06/2004, 11h43
  4. Probleme de composant inclus dans un autre.
    Par viro dans le forum C++Builder
    Réponses: 7
    Dernier message: 05/04/2004, 15h44
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo