Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utilisation variable extern

Sujet résolu
    11 avril 2018 à 15:25:31

    Coucou tout le monde, je connais un peu le C, mais je dois avouer avoir toujours un problème avec l'utilisation de "extern". Je m'explique : 

    Quelle est la différence entre : 

    file1.h

    extern int var1;
    
    int fct1(int);
    
    

    file1.c

    #include "file1.h"
    
    int var1 = 10;
    
    int fct1(int var2)
    {
    return(var1+var2);
    }
    
    

    main.c

    #include "file1.h"
    
    void main(void)
    {
    fct1(10);
    printf("%d",var1);
    }

    et, quasiment la même chose sauf que : 

    file1.h

    int var1=10;
    
    int fct1(int);
    
    

    file1.c

    #include "file1.h"
    
    
    int fct1(int var2)
    {
    return(var1+var2);
    }
    
    

    main.c

    #include "file1.h"
    
    void main(void)
    {
    fct1(10);
    printf("%d",var1);
    }

    J'ai peur d'écrire une grosse connerie mais j'avoue que je suis pas mal dans le flou ...

    Merci d'avance :)


    -
    Edité par Arkh3n 11 avril 2018 à 15:26:37

    • Partager sur Facebook
    • Partager sur Twitter
      11 avril 2018 à 15:42:58

      Tu as compilé ?

      Si oui, tu as du remarqué que la deuxième solution ne compile pas !

      Définition multiple de variables !

      Pour palier à cela :  On ne défini pas les variables dans les fichiers entête.

      • Partager sur Facebook
      • Partager sur Twitter
        11 avril 2018 à 15:45:18

        nope, j'ai pas compilé ..

        Pourquoi il y a une définition multiple de variables ? A quel endroit ? Je ne la définis pas à nouveau ma variable var1, si ?

        • Partager sur Facebook
        • Partager sur Twitter
          11 avril 2018 à 16:02:58

          Arkh3n a écrit:

          Pourquoi il y a une définition multiple de variables ? A quel endroit ? Je ne la définis pas à nouveau ma variable var1, si ?

          Si. Tu inclus file1.h dans file1.c et main.c

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            11 avril 2018 à 16:22:57

            ah ouais, pas faux..

            bon bah merci alors ! :)

            • Partager sur Facebook
            • Partager sur Twitter
              11 juillet 2018 à 9:33:32

              Je me permets d'up ce sujet.

              Quand j'avais posé ma question, j'avais oublié d'écrire dans le .h : 

              #ifndef File1
              #define File1
              
              int var1=10;
               
              int fct1(int);
              
              #endif


              avec le #ifndef, normalement je ne devrais pas avoir de soucis avec la définition multiple, si ? Parce que si je comprend bien le préprocesseur, vu qu'il a défini File1, il ne repasse pas dedans, donc ne définit pas à nouveau var1, si ?

              Pourtant, il m'a quand même fallu mettre le extern pour ne pas me retrouver avec des erreurs...

              Merci :)

              • Partager sur Facebook
              • Partager sur Twitter
                11 juillet 2018 à 10:44:53

                Arkh3n a écrit:

                avec le #ifndef, normalement je ne devrais pas avoir de soucis avec la définition multiple, si ? Parce que si je comprend bien le préprocesseur, vu qu'il a défini File1, il ne repasse pas dedans, donc ne définit pas à nouveau var1, si ?

                Si, car les compilations de main.c et file1.c sont indépendantes. Entre deux compilations, tout est oublié.
                Ce n'est pas pour résoudre ce genre de problème que les gardes d'inclusion sont utiles.

                -
                Edité par Marc Mongenet 11 juillet 2018 à 10:45:48

                • Partager sur Facebook
                • Partager sur Twitter
                  11 juillet 2018 à 10:55:09

                  Marc Mongenet a écrit:

                  Arkh3n a écrit:

                  avec le #ifndef, normalement je ne devrais pas avoir de soucis avec la définition multiple, si ? Parce que si je comprend bien le préprocesseur, vu qu'il a défini File1, il ne repasse pas dedans, donc ne définit pas à nouveau var1, si ?

                  Si, car les compilations de main.c et file1.c sont indépendantes. Entre deux compilations, tout est oublié.
                  Ce n'est pas pour résoudre ce genre de problème que les gardes d'inclusion sont utiles.

                  -
                  Edité par Marc Mongenet il y a 8 minutes

                  Ah, ouais c'est vrai ça semble logique.

                  Merci de la précision :)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Utilisation variable extern

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown