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 :

Question basique sur les variables globales


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut Question basique sur les variables globales
    Bonjour,

    je lis que pour accéder à une variable globale déclarée dans un autre fichier source, il faut ajouter le mot-clé extern;

    Si je prends pour exemple la fonction SDL_GetsTicks qui me permet de récupérer le nombre de milliseconde depuis le commencement de mon programme et si je remonte a son prototype ds le header SDL_timer.h:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void);

    pour que ca soit clair, si il n'y avait pas cette classe de mémorisation (extern) je ne pourrais pas utiliser la variable "nombre de milliseconde écoulées" depuis mon fichier source main.c étant donné que la fonction SDL_GetsTicks est certainement ds le fichier source SDL_timer.c ?

    Merci de vos retours !

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    extern informe le compilateur que la définition de la fonction et son allocation mémoire seront résolues lors de l'édition de liens. Ce qualificatif est implicite pour toutes les déclarations de fonction (pour les variables c'est autre chose) et n'est donc pas nécessaire ici. SDL étant axée sur la portabilité, je pense qu'il est tout de même spécifié dans l'interface pour les compilateurs un peu rigides ou exotiques.

  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    extern informe le compilateur que la définition de la fonction et son allocation mémoire seront résolues lors de l'édition de liens. Ce qualificatif est implicite pour toutes les déclarations de fonction (pour les variables c'est autre chose) et n'est donc pas nécessaire ici. SDL étant axée sur la portabilité, je pense qu'il est tout de même spécifié dans l'interface pour les compilateurs un peu rigides ou exotiques.
    Merci pour l'explication mais quel est l’intérêt que la définition de la fonction et son allocation mémoire soient résolues lors de l'édition de liens?

    Ensuite il y a quelques choses que je ne comprends pas bien, tu dis implicite pour toutes les déclarations de fonctions c.à.d. pour les prototypes ?
    Ce qui veut dire que l'en-tête d'une fonction peut etre différent de son prototype du moins pour la classe de mémorisation extern ou static ?

    exemple:

    declaration:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags);

    En-tete dans le fichier source:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    int SDLCALL SDL_Init(Uint32 flags)

    Désolé si ce n'est pas très coherent mais bon j'essaye de bien comprendre le mécanisme.

    Merci d'avance!

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    En gros pour simplifier, en C/ C++ cela fonctionne avec les unités de compilation : c'est à dire un fichier .cpp + tous les include.

    Si tu as défini une variable dans un fichier .cpp, elle ne sera présente que dans 1 seule unité de compilation.
    Et donc le mot clef extern permet de temporiser la compilation ("il y a une variable déclarée mais définie ailleurs") et c'est à l'édition des liens qu'il retrouvera ces petits.

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Citation Envoyé par foetus Voir le message
    En gros pour simplifier, en C/ C++ cela fonctionne avec les unités de compilation : c'est à dire un fichier .cpp + tous les include.

    Si tu as défini une variable dans un fichier .cpp, elle ne sera présente que dans 1 seule unité de compilation.
    Et donc le mot clef extern permet de temporiser la compilation ("il y a une variable déclarée mais définie ailleurs") et c'est à l'édition des liens qui retrouvera ces petits.
    D'accord je comprends s'est intrinsèque au C / C++ cela fonctionne comme ca that all!

    Ds mon fichier source je peux déclarer et utiliser une variable définie ds un autre fichier source, seulement si je la qualifie avec le mot clé-extern idem pour les fonctions.

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par julien terrier Voir le message
    Merci pour l'explication mais quel est l’intérêt que la définition de la fonction et son allocation mémoire soient résolues lors de l'édition de liens?
    Dans ton cas par exemple, cela permet d'utiliser une bibliothèque sans avoir accès à ses sources et devoir la recompiler.

    Citation Envoyé par julien terrier Voir le message
    Ensuite il y a quelques choses que je ne comprends pas bien, tu dis implicite pour toutes les déclarations de fonctions c.à.d. pour les prototypes ?
    Ce qui veut dire que l'en-tête d'une fonction peut etre différent de son prototype du moins pour la classe de mémorisation extern ou static ?
    Non, la signature de la fonction doit toujours être identique dans sa déclaration et dans sa définition. Simplement pour les déclarations de fonctions telles que celles généralement présentes dans les fichiers headers, extern est sous-entendu : la déclaration a le même sens avec ou sans sa présence. Ce n'est pas le cas pour les déclarations de variables.

  7. #7
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Merci pour le retour, je cloture !

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    Citation Envoyé par julien terrier Voir le message
    pour que ca soit clair, si il n'y avait pas cette classe de mémorisation (extern) je ne pourrais pas utiliser la variable "nombre de milliseconde écoulées" depuis mon fichier source main.c étant donné que la fonction SDL_GetsTicks est certainement ds le fichier source SDL_timer.c ?
    attention à l'emploi des termes...extern n'est pas une classe de mémorisation c'est un mot-clé que comprend le compilateur ( enfin le préprocesseur me semble-t-il ).
    Maintenant à quel but veux-tu arriver ?
    La fonction SDL_GetsTicks est déclarée comme extern pour qu'elle soit référencée dans les autres fichiers sources en .c

  9. #9
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Maintenant à quel but veux-tu arriver ?
    La fonction SDL_GetsTicks est déclarée comme extern pour qu'elle soit référencée dans les autres fichiers sources en .c
    L'objectif de ma question était de comprendre l'utilisation de ces mots-clé, je comprends vite mais il faut m'expliquer longtemps pour que cela soit acquis !

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

Discussions similaires

  1. Question sur les variables globales
    Par hortencia dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/02/2012, 13h13
  2. Question simple sur les variables
    Par roxydu33 dans le forum Débuter
    Réponses: 3
    Dernier message: 14/04/2010, 21h00
  3. question sur les variables globales
    Par acik59 dans le forum C
    Réponses: 8
    Dernier message: 15/05/2007, 13h33
  4. Question basique sur les tableaux
    Par valanagrid dans le forum C++
    Réponses: 8
    Dernier message: 08/11/2006, 15h47
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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