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 :

#include ou extern ?


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut #include ou extern ?
    Voila un petit soucis de structuration de développement me turlupine.
    Imaginons un fichier my_function.h contenant le prorotype d'une fonction quelconque on va dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef _MY_FUNCTION_H
    #define _MY_FUNCTION_H
     
    unsigned short My_Function(char*);
     
    #endif
    Et le fichier my_function.c qui implemente ce header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    #include "my_function.h"
     
    unsigned short My_Function(char* String)
    {
       ...... // Peu import ce que cela fait
       return 0;
    }
    Dans mon fichier main.c, si je veux utiliser cette fonction, dois je faire un #include "my_function.h" et ensuite l'appeller ou bon me semble, ou alors dans quel cas devons nous faire :
    extern unsigned short My_Function(char*);
    Et le linker se debrouille pour trouver le symbole correspondant.
    Merci de m'eclairer

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Pour une fonction, cela ne change pas vraiment. En fait, si tu ne précise pas de classe de mémorisation (extern dans ton cas), cela reviens au même que si tu le met. Donc dans un cas comme dans l'autre (sauf si je me trompe), tu doit tout de même inclure l'en-tête dans les différents modules où tu doit utiliser la fonction.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par CSoldier
    En fait, si tu ne précise pas de classe de mémorisation (extern dans ton cas), cela reviens au même que si tu le met.
    pas sûr, si tu déclare ta fonction dans le .c et que tu ne spécifie pas extern dans l'en tete, ça risque de coincé (redéfinition).

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par gege2061
    Citation Envoyé par CSoldier
    En fait, si tu ne précise pas de classe de mémorisation (extern dans ton cas), cela reviens au même que si tu le met.
    pas sûr, si tu déclare ta fonction dans le .c et que tu ne spécifie pas extern dans l'en tete, ça risque de coincé (redéfinition).
    Oui effectivement dans ce cas là ca risque d'etre assez moche :lol
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: #include ou extern ?
    Citation Envoyé par Zoso_
    Voila un petit soucis de structuration de développement me turlupine.
    Imaginons un fichier my_function.h contenant le prorotype d'une fonction quelconque on va dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef _MY_FUNCTION_H
    #define _MY_FUNCTION_H
     
    unsigned short My_Function(char*);
     
    #endif
    Et le fichier my_function.c qui implemente ce header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    #include "my_function.h"
     
    unsigned short My_Function(char* String)
    {
       ...... // Peu import ce que cela fait
       return 0;
    }
    Dans mon fichier main.c, si je veux utiliser cette fonction, dois je faire un #include "my_function.h" et ensuite l'appeller ou bon me semble
    Oui.

    A lire en entier (tes identificateurs sont incorrects) :

    http://emmanuel-delahaye.developpez.com/codage.htm
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gege2061
    si tu déclare ta fonction dans le .c et que tu ne spécifie pas extern dans l'en tete, ça risque de coincé (redéfinition).
    Ben non. Pour un prototype de fonction, on a pas besoin de extern. On peut le mettre à titre documentaire, mais il n'est pas indispensable. C'est évidemment différent avec un objet.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Je sais pas si ca peut aider mais bon.

    Quand tu compiles un fichier .c utilisant des tes fonctions ou d'autres de n'importe quel librairie, l'inclusion du fichier d'entete est necessaire pour que le compilateur vérifie que tu as bien utilisé ta fonction comme tu la définis. Donc extern pour des fonctions....

    Par contre extern il y a un bon exemple c'est celui de la variable errno. SI tu veux pouvoir l'utiliser dans ton programme il faut que tu soit capable de lui dire voila dans le fichier que je compile j'utilise une variable nommée errno mais qui ne se trouve pâs dans ce fichier. Le compilateur zappe et donne alors la main a l'editeur des liens pour vérifier.

    Si l'editeur ne la trouve dans aucun des fichiers a lier alors il genere une erreur.

    C'est clair ou y'a encore des doutes ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  8. #8
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Je me posais cette question parce qu'en ce moment je regarde les sources de Linux 0.01, et parfois (Linus lui meme donc ! ) utilise extern ou tout simplement remet le prototype d'une fonction pour l'utiliser plutot que de faire des #include. Voila pourquoi je me demandais quand et dans quelle situation il fallait l'utiliser.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Zoso_
    Je me posais cette question parce qu'en ce moment je regarde les sources de Linux 0.01, et parfois (Linus lui meme donc ! ) utilise extern ou tout simplement remet le prototype d'une fonction pour l'utiliser plutot que de faire des #include. Voila pourquoi je me demandais quand et dans quelle situation il fallait l'utiliser.
    Le principe est que lorsque le prototype est séparé, celui-ci ne doit être définit qu'une fois. La meilleure place est donc le header.

    C'est une erreur de conception de multiplier les définitions de prototypes séparés comme tu l'a vu, même si c'est L.T. lui-même qui fait ça. Il connait bien son système, mais ce n'est pas forcément un expert de la programmation en C...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    C'est une erreur de conception de multiplier les définitions de prototypes séparés comme tu l'a vu, même si c'est L.T. lui-même qui fait ça. Il connait bien son système, mais ce n'est pas forcément un expert de la programmation en C...
    Surtout pour la version 0.01... sortie en 1991. Fallait pas s'attendre a quelque chose de super organise: c'etait un vague projet d'OS lance par un mec (presque) seul qui faisait ca pour s'amuser, et en plus ce n'etait pas une version faite pour etre distribuee:
    Citation Envoyé par Linus himself
    I made sources for version 0.01 available on nic sometimes around this time. 0.01 sources weren't actually runnable: they were just a token gesture to arl who had probably started to despair about ever getting anything.
    (...)
    It's mostly in C, but most people wouldn't call what I write C.
    (source: http://www.li.org/linuxhistory.php)

  11. #11
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Merci à tous

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

Discussions similaires

  1. Répertoire include externe
    Par Harooold dans le forum BOUML
    Réponses: 3
    Dernier message: 07/01/2011, 10h55
  2. Include externe d'un fichier .txt : ajout de BR
    Par Comicspidey dans le forum ASP
    Réponses: 2
    Dernier message: 25/08/2010, 23h32
  3. Problème d'include de projet externe
    Par Mouns007 dans le forum C++
    Réponses: 11
    Dernier message: 18/07/2008, 23h13
  4. Includes pages externes
    Par lun4t1k dans le forum Langage
    Réponses: 4
    Dernier message: 04/02/2007, 16h39

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