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 :

mot clé extern


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut mot clé extern
    bonjour, sur la page suivante section 7.2.1 Fichier en-tête d'un fichier source il est marqué : "Par ailleurs, il faut faire précéder la déclaration de la fonction du mot-clef extern, qui signifie que cette fonction est définie dans un autre fichier"

    et il est mis en exemple :

    /**********************************************************************/
    /*** fichier: produit.h ***/
    /*** en-tete de produit.c ***/
    /**********************************************************************/

    extern int produit(int, int);

    pour ma part, dans mon .h, je ne mets jamais le mot clé extern. Est-ce que cela change bcp de chose de ne pas le mettre ?

    Merci.

  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
    ce n'est pas obligatoire, mais c'est la meilleure pratique

  3. #3
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par salseropom
    Est-ce que cela change bcp de chose de ne pas le mettre ?
    Bin non, le prototype de la fonction étant dans un header, elle est automatiquement extern, chose tout à fait logique vu qu'il suffit d'inclure le header dans un fichier source.
    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 !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    OK, merci de vos précisions.

    Merci aussi pour les cours de programmation langage C et la FAQ Langage C

  5. #5
    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
    j'ai tapé trop tot sur envoyer...

    Non ce n'est pas obligatoire, mais c'est recommandé pour plusieurs raisons.

    La première est la lisibilité et la séparation de ce qui est privé et publique.

    Toute fonction à usage exclusif d'un module devrait être déclarée "static".

    Toute fonction non déclarée comme "static" est utilisable à l'extérieur, qu'elle soit ou non dans un ".h", pour peu que l'utilisateur sache comment cette fonction s'appelle....

    Donc, au vu des 2 phrases ci-dessus, un ".h" ne devrait donc contenir que des fonctions à usage public.

    Le mot-clé extern n'est pas obligatoire, mais préféré car :

    - un "include" pourrait (même si cela n'est pas recommandé) se situer n'importe où dans le code source, et par conséquent en particulier éventuellement après une définition d'une fonction locale portant le même nom. Si le mot extern n'est pas utilisé, le compilateur ne se plaindra pas, mais prendra la définition du ".h" comme une nouvelle définition de fonction (vide) qui écrasera la précédente.
    Si par contre la fonction était déclarée extern, le compilateur se plaindra...

    - Pour la même raison mais en sens inverse, si l'include est inclus en tête du fichier, et que l'on re-définit une fonction portant le même nom, si dans le ".h" la routine n'est pas déclarée comme extern le compilateur ne se plaindra pas, et prendra la nouvelle définition comme étant la bonne. Si elle est déclarée comme extern le compilateur se plaindra...

  6. #6
    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 souviron34
    jLa première est la lisibilité et la séparation de ce qui est privé et publique.
    Huh ! Les interfaces publiques sont dans le .h. Ce qui est privé (static) est dans le .c et est rarement séparé de son implémentation... Je ne vois pas ce qu'extern apporte là-dedans. La séparation est 'géographique'.

    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser
    Toute fonction à usage exclusif d'un module devrait être déclarée "static".
    OK.
    Toute fonction non déclarée comme "static" est utilisable à l'extérieur, qu'elle soit ou non dans un ".h", pour peu que l'utilisateur sache comment cette fonction s'appelle....
    Il est d'usage (Bonne Manière) qu'elle ait un prototype séparé et qui soit placé dans un .h visible de l'implémentation (une option de gcc permet de faire un warning en cas de manquement).
    Donc, au vu des 2 phrases ci-dessus, un ".h" ne devrait donc contenir que des fonctions à usage public.
    Tu parles de prototypes, bien sûr...

    [C99] Le cas des fonctions inline est un peu étrange, car il existe des 'static inline'...
    Le mot-clé extern n'est pas obligatoire, mais préféré car :

    - un "include" pourrait (même si cela n'est pas recommandé) se situer n'importe où dans le code source, et par conséquent en particulier éventuellement après une définition d'une fonction locale portant le même nom. Si le mot extern n'est pas utilisé, le compilateur ne se plaindra pas, mais prendra la définition du ".h" comme une nouvelle définition de fonction (vide) qui écrasera la précédente.
    Si par contre la fonction était déclarée extern, le compilateur se plaindra...
    Mmm... possible... portable ?
    - Pour la même raison mais en sens inverse, si l'include est inclus en tête du fichier, et que l'on re-définit une fonction portant le même nom, si dans le ".h" la routine n'est pas déclarée comme extern le compilateur ne se plaindra pas, et prendra la nouvelle définition comme étant la bonne. Si elle est déclarée comme extern le compilateur se plaindra...
    Moui, pas sur que ce soit une exigence du langage, mais plutôt une QoI (Quality of Implementation)

  7. #7
    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 Emmanuel Delahaye
    Il est d'usage (Bonne Manière) qu'elle ait un prototype séparé et qui soit placé dans un .h visible de l'implémentation (une option de gcc permet de faire un warning en cas de manquement).

    Tu parles de prototypes, bien sûr...
    OUI mais c'était justement le sens de sa question d'origine...
    (visiblement il avait envie de se passer des extern...)
    Et TOUTE fonction même non déclarée dans le '.h", si elle n'est pas déclarée statique, peut être appelée par tout module externe, pour peu qu'on se lie avec la bonne bibliothèque..

    [C99] Le cas des fonctions inline est un peu étrange, car il existe des 'static inline'...
    Il me semble que ça existait aussi avant, non ?


    Le mot-clé extern n'est pas obligatoire, mais préféré car :

    - un "include" pourrait (même si cela n'est pas recommandé) se situer n'importe où dans le code source, et par conséquent en particulier éventuellement après une définition d'une fonction locale portant le même nom. Si le mot extern n'est pas utilisé, le compilateur ne se plaindra pas, mais prendra la définition du ".h" comme une nouvelle définition de fonction (vide) qui écrasera la précédente.
    Si par contre la fonction était déclarée extern, le compilateur se plaindra...
    Mmm... possible... portable ?

    - Pour la même raison mais en sens inverse, si l'include est inclus en tête du fichier, et que l'on re-définit une fonction portant le même nom, si dans le ".h" la routine n'est pas déclarée comme extern le compilateur ne se plaindra pas, et prendra la nouvelle définition comme étant la bonne. Si elle est déclarée comme extern le compilateur se plaindra...
    Moui, pas sur que ce soit une exigence du langage, mais plutôt une QoI (Quality of Implementation)
    Ce n'est pas une exigence du tout (quoique... voir plus bas.. mais je ne connais pas les specs des compilos), mais c'est constant dans les implémentations, ne serait-ce que pour répondre aux gens qui mettent des protoypes vides en tête de leurs modules (une reminiscence de Pascal, sans doute )

    Quand tu mets un proto vide en tête, quand le compilo rencontre la vraie défintion, il remplace. (suivant l'ordre de compil ou de liens)

    Et donc c'est hautement dangereux, si la fonction porte le même nom qu'une qui est dans un ".h" et n'est pas déclarée extern, car elle est alors remplacée... et réciproquement...

    Exemple :

    faire appel à sqrt sans avoir inclus "math.h" ne provoque pas de scandale (en tout cas pas que j'ai vu), mais sort 0... D'ailleurs toutes les fonctions de maths se comprtent de la même manière (log par exemple)...

  8. #8
    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 salseropom
    extern int produit(int, int);

    pour ma part, dans mon .h, je ne mets jamais le mot clé extern. Est-ce que cela change bcp de chose de ne pas le mettre ?
    Pour les fonctions, le mot clé extern devant un prototype a une valeur purement documentaire. On a le droit de l'omettre

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/11/2010, 17h00
  2. le mot clef extern ?
    Par ikuzar dans le forum Débuter
    Réponses: 4
    Dernier message: 30/07/2009, 14h50
  3. Deux questions sur le mot clé EXTERN
    Par Bleys dans le forum C++
    Réponses: 4
    Dernier message: 02/03/2008, 14h58
  4. Passage de C++ à Java (mot clef extern)
    Par grodwar dans le forum Langage
    Réponses: 5
    Dernier message: 05/05/2007, 13h06
  5. mot clé extern
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 28/06/2006, 09h19

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