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 :

Deux questions sur le mot clé EXTERN


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut Deux questions sur le mot clé EXTERN
    Bonjour à tous,
    ce sujet n'est pas un réel problème mais juste une question de compréhension concernant le mot clé extern.
    L'idée que j'ai du rôle de ce mot est simple : permet au compilateur de savoir que telle variable (ou fonction) va être utilisé dans mon fichier source, mais que sa définition se trouve ailleurs ... Vrai ?
    Bien, alors j'ai osé à faire ceci :
    Fichier1.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    void uneFonction();
    extern int i = 50;
     
    int main()
    {
         ...
         return 0;
    }
    Fichier2.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    extern int i;
    void uneFonction()
    {
        ...
    }
    J'envoi ensuite la compilation :
    g++ -Wall -pedantic Fichier1.c Fichier2.c

    Et là à mon grand étonnement la compilation fonctionne. J'ai effectivement un message d'avertissement comme quoi i est initialisé et déclaré en extern, mais la compilation va jusqu'au bout ... Pour moi ceci aurait dû planter ... Est-ce que quelqu'un peut m'expliquer pourquoi ça fontionne ? Est-ce que parce que le compilo ne trouve aucun i extern, il prend la valeur définie dans fichier1 ?

    Deuxième question rapide, j'ai fait des recherches sur le net avant de venir et je suis tombé sur ça :
    Utilisez extern "c" pour empêcher que les noms de fonction soient substantypés dans des programmes C++.
    Je ne comprends pas ce que ça veut dire, pourriez-vous m'éclairer ?



    Merci de votre lecture et de votre aide

  2. #2
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Pour ta 2ème question : le mot clef extern peut être utilisé pour 2 choses trés différente :
    - la déclaration de variable / fonction définies allieurs
    - l'utilisation de fonctions C à l'intérieur d'un programme C++

    Pour ta première question : je penses que le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern int i = 50;
    Force le compilateur à définir i à cet endroit, car une déclaration extern ne devrait pas être utilisé en même temps qu'un utilisation de valeur. La syntaxe standard est :

    Code fichier1.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    extern int i;
    ...
    Code fichier1.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    int i = 50;
    ...
    Code fichier2.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "fichier1.h"
     
    int main() {
      printf("i = %d", i);
    }

  3. #3
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Ok pour la seconde question et merci

    Ensuite pour l'histoire de extern int i je suis d'accord avec la structure que tu as donné concernant les fichiers h et c et encore que pour fichier1.c ne serait-ce pas uniquement i = 50 ?

    J'avoue que je ne pige toujours pas comment ça se fait que ça fonctionne, que se dit le compilo et qu'est-ce qu'il fait ?



    Quoi qu'il en soit, merci de ton aide

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Bleys Voir le message
    Bonjour à tous,
    ce sujet n'est pas un réel problème mais juste une question de compréhension concernant le mot clé extern.
    L'idée que j'ai du rôle de ce mot est simple : permet au compilateur de savoir que telle variable (ou fonction) va être utilisé dans mon fichier source, mais que sa définition se trouve ailleurs ... Vrai ?
    En première approximation, oui. Il a deux effets :
    - Indiquer que la variable associée n'est pas locale au fichier source concerné, mais peut être partagée avec une variable de même nom dans d'autres fichiers source (on dit qu'elle a un external linkage). Dans cette utilisation, extern s'oppose à static.
    - Transformer certaines définitions en déclaration.

    Citation Envoyé par Bleys Voir le message
    Et là à mon grand étonnement la compilation fonctionne. J'ai effectivement un message d'avertissement comme quoi i est initialisé et déclaré en extern, mais la compilation va jusqu'au bout ...
    Le point important est que la variable soit déclarée autant de fois qu'on veut, mais définie une seule fois (et comme ta variable a un external linkage, le "une seule fois" signifie "une seule fois dans tous les fichiers sources que l'on lie ensemble, si elle avait un internal linkage, ce serait une seule fois dans le fichier source courant).

    Maintenant, qu'est-ce qui est déclaration, qu'est-ce qui est définition ?
    Citation Envoyé par La norme, 3.1/2
    A declaration is a definition unless it declares a function without specifying the function’s body (8.4), it contains the extern specifier (7.1.1) or a linkagespecification24) (7.5) and neither an initializer nor a functionbody,
    it declares a static data member in a class declaration (9.4), it is a class name declaration (9.1), or it is a typedef declaration (7.1.3), a usingdeclaration (7.3.3), or a usingdirective (7.3.4).
    int i; // définition
    int i = 1; // définition
    extern int i; // déclaration
    extern int i = 1; // définition

    Citation Envoyé par Bleys Voir le message
    Deuxième question rapide, j'ai fait des recherches sur le net avant de venir et je suis tombé sur ça :
    Utilisez extern "c" pour empêcher que les noms de fonction soient substantypés dans des programmes C++.
    Je ne comprends pas ce que ça veut dire, pourriez-vous m'éclairer ?
    Il s'agit d'une autre utilisation d'extern, qui n'a pas grand-chose à voir avec la première. Elle permet d'indiquer dans un programme C++ qu'une fonction suivra une convention d'appel d'un autre langage (typiquement C, c'est d'ailleur le seul langage cité dans la norme à ce sujet), afin de permettre d'interfacer ce code avec du code écrit dans l'autre langage.

  5. #5
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Donc au final le extern est "ignoré" ... puisqu'il ne sert strictement à rien ici ?

    Merci pour tes explications complètes en tout cas

Discussions similaires

  1. Deux questions sur un cours SGBD
    Par Francois_quad dans le forum Débuter
    Réponses: 3
    Dernier message: 17/01/2007, 18h40
  2. [Système] Deux questions sur PHP
    Par Oprichnik dans le forum Langage
    Réponses: 9
    Dernier message: 04/09/2006, 23h59
  3. [HTML] Deux questions sur l'insertion d'icônes (favoris)
    Par LE NEINDRE dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/02/2006, 15h47
  4. [Débutant] Deux questions sur la conversion (cast)
    Par kloss dans le forum Langage
    Réponses: 7
    Dernier message: 18/02/2006, 20h46
  5. [Together] Deux questions sur Borland Together UML
    Par srvremi dans le forum Autres
    Réponses: 4
    Dernier message: 02/11/2005, 10h32

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