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 :

les headers et les preprocesseurs ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut les headers et les preprocesseurs ?
    Bonjour,
    J'ai actuellement un problème de compréhension des headers, leur inclusion, et la définition de fonction dans les fichiers *.h (je développe sous kdevelop)

    Un exemple très simple.

    Je pensais que si je créais un prog1.h avec dedans :

    #include <stdio.h>
    #include <stdlib.h>

    void test()
    {
    printf("voilà ça marche");
    }
    puis que dans un tout bête prog2.c je mettais

    #include prog1.h

    void main
    {
    test();
    }
    Cela fonctionnerais... mais visiblement je n'ai pas tout compris, mon compilateur me dit "définition multiple de "test") ...difficile de trouver quelque chose de clair à ce sujet...


    merci

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Jei,

    Un header ne doit pas contenir de code, et donc ne doit pas contenir de définitions de fonctions, mais uniquement leurs déclarations.

    A partir de là, je te laisse cogiter.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par droggo Voir le message
    Un header ne doit pas contenir de code, et donc ne doit pas contenir de définitions de fonctions, mais uniquement leurs déclarations.
    C'est vrai dans le principe mais en l'occurence, si Titimoi nous a montré son code au complet, ça ne devrait pas l'empêcher de compiler.

    Citation Envoyé par titimoi
    J'ai actuellement un problème de compréhension des headers, leur inclusion, et la définition de fonction dans les fichiers *.h (je développe sous kdevelop)
    L'idée générale est de placer dans un header les déclarations de ce que tu vas utiliser ou définir ailleurs.

    Pour faire un parallèle, tu peux imaginer un constructeur d'avions qui utilise les moteurs d'une autre compagnie. Ces derniers ne sont pas encore disponibles à la construction de l'appareil, mais peu importe : si l'on te file une fiche qui t'explique comment on les utilises et comment ils se montent, tu peux concevoir un appareil compatible à l'avance. Une fois que les constructions de l'appareil et des moteurs sont achevées, il n'y a plus qu'à les assembler. Cette dernière phase correspond à l'édition des liens ou linking en informatique.

    Les fichiers « objet » que tu assembles peuvent être soit issus du même projet (plusieurs fichiers .c), ce qui t'évite d'avoir à tout recompiler chaque fois que tu fais la moindre modif', soit être formés par des bibliothèques dynamiques, dont les fonctions sont disponibles à l'avance et généralement proposées par ton système d'exploitation.

    Ainsi, quand tu inclus <math.h>, par exemple, tu n'inclus pas la bibliothèque mathématique elle-même, mais tu fais lire au compilateur ses spécifications. À la fin, quand ton programme est compilé, il faut le lier dans les faits à la bibliothèque mathématique avec -lm.

    À noter que le compilateur C proprement dit ne fait pas de distinction entre *.c, *.h ou autre. Tout fichier inclus avec #include sera inséré en entier à cette position comme si son contenu avait été directement saisi dans le fichier principal. À toi de faire en sorte, donc, qu'il soit bien écrit, sinon les erreurs de syntaxe peuvent se propager d'un fichier à l'autre, même si tous les compilateurs aujourd'hui sont suffisamment intelligents pour te le signaler.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut
    merci beaucoup pour vos réponses elles sont très instructives, donc en gros ce que j'ai comprs (il est tard) et ce dont j'ai besoin c'est simplement d'un header que je "donne" en

    #include <prog1.h>
    seulement mon prog1.h est sans définition de fonction, mais simplement en déclaration, donc je suis censé mettre simplement :

    qui est donc la déclaration de ma fonction ??

    (je vous explique brièvement l'exercice que j'ai à faire :

    -Faire un programme en C qui "comporte le module etudiant.c avec son header etudiant.h." (les guillemet sont de la traduction approximative qui me semble coller)

    -Le fichier principal main.c ne doit comporter que la fonction "main" toutes les autre fonctions doivent être implémentée dans le fichiers etudiant.c
    .. entre autre...

    donc ce que je ne comprends pas c'est :

    -quand on a un etudiant.h c'est qu'il y a forcément un étudiant.c ? (le étudiant.h déclare les fonctions, et le etudiant.c les définie ?)

    -comment forme-t-on un étudiant.h ??

    -pouvez-vous me faire un exemple (très très bêtes du style "hello world") pour que je comprenne.

    Est-ce

    prog1.c qui contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void hello();
    {
    printf("hello world");
    }
    un prog1.h qui contient

    et enfin un end.c qui contient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <prog1.h>
     
    void main ()
    {
    hello();
    }
    Cela fonctionnerais selon vous ?
    (je n'ai pas essayé il est trop tard, mais j'aimerais avoir votre analyse)

    Merci encore

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    donc je suis censé mettre simplement : void test(); qui est donc la déclaration de ma fonction ??
    Oui. Dans le cas présent, on appelle cela le prototype de ta fonction.

    En procédant de cette manière, d'autres développeurs peuvent écrire des applications qui exploitent ce que tu as écrit. Ils n'ont plus, alors, qu'à les lier à une bibliothèque (statique ou dynamique), ou bien à intégrer tel quel le programme *.c correspondant directement dans leur projet.

    Citation Envoyé par titimoi Voir le message
    -quand on a un etudiant.h c'est qu'il y a forcément un étudiant.c ? (le étudiant.h déclare les fonctions, et le etudiant.c les définie ?)
    Pas systématiquement, et cela n'a rien d'obligatoire, mais en pratique, c'est pratiquement toujours le cas. Il se peut également qu'un seul gros fichier *.h contiennent les prototypes d'un grand nombre de fonctions très complexes qui, elles, sont définies dans plusieurs fichiers *.c différents. L'inverse est possible également mais comme cela n'a que peu d'intérêt, c'est un cas de figure que l'on ne rencontre pour ainsi dire jamais.

    -comment forme-t-on un étudiant.h ??
    De la même façon qu'un fichier *.c. Pour le compilateur, cela reste le même langage. L'extension *.h est normalisée (autant que je sache) mais elle sert surtout à renseigner le programmeur sur ce que l'on trouve dans le fichier.

    Est-ce [...] Cela fonctionnerais selon vous ?Merci encore
    Oui, c'est cela, tu as compris.
    Quelques remarques cependant :

    - Il se peut que tu aies à inclure ton <prog.h> dans ton <prog.c> lui-même, si le header définit des macros, par exemple, ou si les différentes fonctions déclarées doivent se faire mutuellement référence.

    - Comme ton fichier *.h est appelé à être inclus par différents fichiers, il est possible que dans une même passe, ce .h soit appelé deux fois. L'usage veut que l'on mette une garde protégeant son contenu contre les inclusions multiple avec un #if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef PROG_H_xxxxxx
    #define PROG_H_xxxxxx
     
    ....
     
    #endif
    - Aujourd'hui, on préférera toujours déclarer une fonction main() comme int plutôt que void, car le système d'exploitation attend un code de retour.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Oui. Dans le cas présent, on appelle cela le prototype de ta fonction.
    Heu non, dans le cas présent il s'agit juste de la déclaration et non du prototype.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par titimoi Voir le message
    seulement mon prog1.h est sans définition de fonction, mais simplement en déclaration, donc je suis censé mettre simplement :

    qui est donc la déclaration de ma fonction ??
    A lire d'urgence :

    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser

    Est-ce

    prog1.c qui contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void hello();
    {
    printf("hello world");
    }
    un prog1.h qui contient

    et enfin un end.c qui contient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <prog1.h>
     
    void main ()
    {
    hello();
    }
    Cela fonctionnerais selon vous ?
    (je n'ai pas essayé il est trop tard, mais j'aimerais avoir votre analyse)
    C'est presque bon. La correction est dans les articles cités.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut
    merci

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Jei,
    Citation Envoyé par Obsidian Voir le message
    C'est vrai dans le principe mais en l'occurence, si Titimoi nous a montré son code au complet, ça ne devrait pas l'empêcher de compiler.
    Comme dirait Emmanuel, et comme je le dis aussi, les bonnes habitudes sont à prendre tout de suite, et encourager un débutant dans sa mauvaise conception n'est pas lui rendre service.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut
    Pour revenir sur mon sujet (oui désolé mais on s'écarte un peu là !, j'ai bien compris maintenant que les *.h c'est des déclarations, c'est la fiche technique..)

    je sens bien que l'on est proche du but.. où est le problème avec ces déclarations multiple... ??

  11. #11
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense que ta déclaration dans lili.h n'est en fait pas une déclaration mais une définition.

    essaye plutôt :
    Code lili.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern void test(void);
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par droggo Voir le message
    Comme dirait Emmanuel, et comme je le dis aussi, les bonnes habitudes sont à prendre tout de suite, et encourager un débutant dans sa mauvaise conception n'est pas lui rendre service.
    Je suis entièrement d'accord mais ce n'était pas l'objet de mon post. J'expliquais que ce n'était pas ça qui empêchait son code de compiler dans le cas présent (sauf si le code présenté n'était qu'un extrait).

Discussions similaires

  1. Mail envoyé avec les headers et les balises HTML
    Par monlou dans le forum Langage
    Réponses: 1
    Dernier message: 04/08/2014, 04h13
  2. Les includes et les headers!?
    Par Malfrats dans le forum Débuter
    Réponses: 4
    Dernier message: 14/04/2011, 17h30
  3. ou trouver les header et les librairie, dll de SDL ?
    Par MohEllayali dans le forum SDL
    Réponses: 1
    Dernier message: 29/11/2009, 17h35
  4. Les #includes et les headers - Génie logiciel
    Par FroZman dans le forum C++
    Réponses: 8
    Dernier message: 11/05/2009, 16h51

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