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 :

Error Multiple Declaration Of


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut Error Multiple Declaration Of
    Bonjour,

    Je réalise un projet en OpenGL / C pour la réalisation d'un morpion.

    Pour commencer sur de bonne base j'ai voulu déclaré mes variables qui seront utilisées dans plusieurs fichiers .c dans un .h.

    Je suis en présence d'un problème de redondance de déclarations pourtant j'ai bien encadré mes fichiers .h du IFNDEF.

    multiple definition of `ex' par exemple.

    Par ailleurs si vous avez des remarques qui me permettraient d'avoir une meilleur structure ou autres je suis preneur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #ifndef _EXTERN_
    #define _EXTERN_
     
    // POSITION DE LA FENETRE
    #define POS_FENETRE_X 100
    #define POS_FENETRE_Y 100
     
    // TAILLE DE LA FENETRE
    #define TAILLE_FENETRE_X 500
    #define TAILLE_FENETRE_Y 500
     
    // CAMERA
    # define CAM_ANGLE 120
    # define CAM_FEAR 20
    # define CAM_NEAR 1
     
    // TYPE BOOLEAN
    typedef enum { false, true } bool;
     
    // TYPE JOUEUR
     
    typedef struct Joueur joueur;
    struct Joueur{
        int score;
        char pseudo[100];
        bool gagnant;
        bool aJouer;
    };
     
    extern joueur joueur1 = {0, "",false, false};
    extern joueur joueur2 = {0, "",false, false};
     
    // PARTI
    extern bool parti_fini = false;
     
    extern float angle=0.0;
    extern float ex=0.0;
    extern float ey=0.0;
    extern float ez=-4.0;
    extern float scalex = 5.0;
    extern float scaley = 5.0;
    extern float scalez = 5.0;
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef _JOUEUR /* L'écriture ici présente n'est pas universelle */
    #define _JOUEUR /* Edit suite aux corrections des posts suivants -> */
    /*Il est conseillé d'utiliser MON_FICHIER : pas de underscore au début */
    /* Tu places ici les prototypes de tes fonctions */
     
    #include "var.h"
    //joueur initJoueur();
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    #include <GL/glut.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    #include "morpion.h"
    #include "var.h"
    #include "joueur.h"
     
    void init(void)
    {
       glClearColor (0.2, 0.2, 0.2, 0);
       glEnable (GL_DEPTH_TEST);
    }
     
    void display(void)
    {
        glLoadIdentity ();
        gluLookAt (ex, ey, ez, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
        glClear (GL_COLOR_BUFFER_BIT);
        glClear (GL_DEPTH_BUFFER_BIT);
     
        glRotatef(angle,0,1,0);
        glPushMatrix();
    	plateau();
    	glPopMatrix();
     
        glutSwapBuffers();
    }
     
    void mon_timer(int val)
    {
       angle=angle+1;
       if (angle==360)
            angle=0;
     
       glutTimerFunc(20,mon_timer,1);
       glutPostRedisplay();
    }
     
    void keyboard(unsigned char key, int x, int y)
    {
       switch (key) {
          case 'x':
             ex=ex+0.05;
             break;
          case 'X':
             ex=ex-0.05;
             break;
          case 'y':
             ey=ey+0.05;
             break;
          case 'Y':
             ey=ey-0.05;
             break;
          case 'z':
             ez=ez+0.05;
             break;
          case 'Z':
             ez=ez-0.05;
             break;
          case 27:
             exit(0);
             break;
       }
       glutPostRedisplay();
    }
     
     
    void reshape (int w, int h) // champs de vision
    {
       glViewport (0, 0, (GLsizei) w, (GLsizei) h);
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
       gluPerspective(CAM_ANGLE,w/h,CAM_NEAR,CAM_FEAR);
       glMatrixMode (GL_MODELVIEW);
    }
     
    int main(int argc, char** argv)
    {
        glutInit(&argc, argv);
        glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
        glutInitWindowSize (TAILLE_FENETRE_X, TAILLE_FENETRE_Y);
        glutInitWindowPosition (POS_FENETRE_X, POS_FENETRE_Y);
        glutCreateWindow (argv[0]);
     
        init ();
        glutTimerFunc(20, mon_timer, 1);
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutKeyboardFunc(keyboard);
     
        glutMainLoop();
        return 0;
    }

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Cela ne devrait pas se produire avec ce que l'on a sous les yeux. Quel est ton système ? Quel compilateur utilises-tu ?

    Une remarque non liée : les noms commençant par un underscore _, qu'ils identifient des symboles, des variables, des fonctions ou des types sont réservés pour le compilateur et ne doivent pas être utilisés si tu ne veux pas avoir de mauvaise surprise un jour. C'est d'ailleurs mentionné dans un commentaire de l'un de tes headers.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Merci de ta réponse rapide.

    J'ai en effet effectué un maximum de test.

    J'ai pu lire sur différent forums que le extern placé devant permettaient au même titre que le ifndef d'avoir une implémentation unique.

    Pour compiler j'utilise sous Linux l' IDE Code Block avec GNU GCC Compiler et dans linkers options -lGL -lGLU -lglut -lX11 -lm

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Une image du compilateur
    Images attachées Images attachées  

  5. #5
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Les lignes indiquées par le compilateur ne correspondent pas à ton fichier. Je ne sais pas ce que l'IDE tente de compiler mais ça ne semble pas être ton main.c .

    Ouvres un terminal et essaies de compiler directement en ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -std=c11 -pedantic -Wall -Wextra -c main.c

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    quentin@ubuntu:~/Morpion_OpenGL/Morpion$ gcc -std=c11 -pedantic -Wall -Wextra -c main.c
    In file included from main.c:7:0:
    var.h:30:15: warning: ‘joueur1’ initialized and declared ‘externextern joueur joueur1 = {0, "",false, false};
                   ^
    var.h:31:15: warning: ‘joueur2’ initialized and declared ‘externextern joueur joueur2 = {0, "",false, false};
                   ^
    var.h:34:13: warning: ‘parti_fini’ initialized and declared ‘externextern bool parti_fini = false;
                 ^
    var.h:36:14: warning: ‘angle’ initialized and declared ‘externextern float angle=0.0;
                  ^
    var.h:37:14: warning: ‘ex’ initialized and declared ‘externextern float ex=0.0;
                  ^
    var.h:38:14: warning: ‘ey’ initialized and declared ‘externextern float ey=0.0;
                  ^
    var.h:39:14: warning: ‘ez’ initialized and declared ‘externextern float ez=-4.0;
                  ^
    var.h:40:14: warning: ‘scalex’ initialized and declared ‘externextern float scalex = 5.0;
                  ^
    var.h:41:14: warning: ‘scaley’ initialized and declared ‘externextern float scaley = 5.0;
                  ^
    var.h:42:14: warning: ‘scalez’ initialized and declared ‘externextern float scalez = 5.0;
                  ^
    main.c: In function ‘mon_timer’:
    main.c:31:20: warning: unused parameter ‘val’ [-Wunused-parameter]
     void mon_timer(int val)
                        ^
    main.c: In function ‘keyboard’:
    main.c:41:38: warning: unused parameter ‘x’ [-Wunused-parameter]
     void keyboard(unsigned char key, int x, int y)
                                          ^
    main.c:41:45: warning: unused parameter ‘y’ [-Wunused-parameter]
     void keyboard(unsigned char key, int x, int y)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    -------------- Build: Debug in Morpion (compiler: GNU GCC Compiler)---------------
     
    gcc -Wall -g  -c /home/quentin/Morpion_OpenGL/Morpion/joueur.c -o obj/Debug/joueur.o
    In file included from /home/quentin/Morpion_OpenGL/Morpion/joueur.h:6:0,
                     from /home/quentin/Morpion_OpenGL/Morpion/joueur.c:4:
    g++  -o bin/Debug/Morpion obj/Debug/joueur.o obj/Debug/main.o obj/Debug/morpion.o  -lGL -lGLU -lglut -lX11 -lm  -lGL -lX11
    obj/Debug/main.o:(.bss+0x0): multiple definition of `joueur1'
    obj/Debug/joueur.o:(.bss+0x0): first defined here
    obj/Debug/main.o: In function `display':
    /home/quentin/Morpion_OpenGL/Morpion/main.c:19: multiple definition of `joueur2'
    obj/Debug/joueur.o:(.bss+0x80): first defined here
    obj/Debug/main.o: In function `mon_timer':
    /home/quentin/Morpion_OpenGL/Morpion/main.c:33: multiple definition of `parti_fini'
    obj/Debug/joueur.o:(.bss+0xf0): first defined here
    obj/Debug/main.o: In function `mon_timer':
    /home/quentin/Morpion_OpenGL/Morpion/main.c:33: multiple definition of `angle'
    obj/Debug/joueur.o:(.bss+0xf4): first defined here
    obj/Debug/main.o: In function `mon_timer':
    /home/quentin/Morpion_OpenGL/Morpion/main.c:33: multiple definition of `ex'
    obj/Debug/joueur.o:(.bss+0xf8): first defined here
    obj/Debug/main.o: In function `mon_timer':
    /home/quentin/Morpion_OpenGL/Morpion/main.c:33: multiple definition of `ey'
    obj/Debug/joueur.o:(.bss+0xfc): first defined here
    obj/Debug/main.o: In function `init':
    /home/quentin/Morpion_OpenGL/Morpion/main.c:11: multiple definition of `ez'
    obj/Debug/joueur.o:(.data+0x0): first defined here
    obj/Debug/main.o: In function `init':
    /home/quentin/Morpion_OpenGL/Morpion/main.c:12: multiple definition of `scalex'
    obj/Debug/joueur.o:(.data+0x4): first defined here
    obj/Debug/main.o: In function `init':
    /home/quentin/Morpion_OpenGL/Morpion/main.c:12: multiple definition of `scaley'
    obj/Debug/joueur.o:(.data+0x8): first defined here
    obj/Debug/main.o: In function `init':
    /home/quentin/Morpion_OpenGL/Morpion/main.c:12: multiple definition of `scalez'
    obj/Debug/joueur.o:(.data+0xc): first defined here
    collect2: error: ld returned 1 exit status
    Process terminated with status 1 (0 minute(s), 0 second(s))
    9 error(s), 20 warning(s) (0 minute(s), 0 second(s))
    Build log je ne sais pas pourquoi mon IDE compile avec du gcc et ensuite du g++...

  7. #7
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    warning: ‘...’ initialized and declared ‘extern ne fais pas attention à ce warning, GCC est parfois un peu lunatique.

    Même chose avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -std=c11 -pedantic -Wall -Wextra joueur.c main.c morpion.c -lGL -lGLU -lglut -lX11 -lm
    ?

    Tu es sûr de la configuration de ton projet dans l'IDE ? C'est bien un projet C ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Pour la configuration je n'en suis pas sur je ne maitrise pas énormement CodeBlocks

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    In file included from joueur.h:6:0,
                     from joueur.c:4:
    var.h:30:15: warning: ‘joueur1’ initialized and declared ‘externextern joueur joueur1 = {0, "",false, false};
                   ^
    var.h:31:15: warning: ‘joueur2’ initialized and declared ‘externextern joueur joueur2 = {0, "",false, false};
                   ^
    var.h:34:13: warning: ‘parti_fini’ initialized and declared ‘externextern bool parti_fini = false;
                 ^
    var.h:36:14: warning: ‘angle’ initialized and declared ‘externextern float angle=0.0;
                  ^
    var.h:37:14: warning: ‘ex’ initialized and declared ‘externextern float ex=0.0;
                  ^
    var.h:38:14: warning: ‘ey’ initialized and declared ‘externextern float ey=0.0;
                  ^
    var.h:39:14: warning: ‘ez’ initialized and declared ‘externextern float ez=-4.0;
                  ^
    var.h:40:14: warning: ‘scalex’ initialized and declared ‘externextern float scalex = 5.0;
                  ^
    var.h:41:14: warning: ‘scaley’ initialized and declared ‘externextern float scaley = 5.0;
                  ^
    var.h:42:14: warning: ‘scalez’ initialized and declared ‘externextern float scalez = 5.0;
                  ^
    In file included from main.c:7:0:
    var.h:30:15: warning: ‘joueur1’ initialized and declared ‘externextern joueur joueur1 = {0, "",false, false};
                   ^
    var.h:31:15: warning: ‘joueur2’ initialized and declared ‘externextern joueur joueur2 = {0, "",false, false};
                   ^
    var.h:34:13: warning: ‘parti_fini’ initialized and declared ‘externextern bool parti_fini = false;
                 ^
    var.h:36:14: warning: ‘angle’ initialized and declared ‘externextern float angle=0.0;
                  ^
    var.h:37:14: warning: ‘ex’ initialized and declared ‘externextern float ex=0.0;
                  ^
    var.h:38:14: warning: ‘ey’ initialized and declared ‘externextern float ey=0.0;
                  ^
    var.h:39:14: warning: ‘ez’ initialized and declared ‘externextern float ez=-4.0;
                  ^
    var.h:40:14: warning: ‘scalex’ initialized and declared ‘externextern float scalex = 5.0;
                  ^
    var.h:41:14: warning: ‘scaley’ initialized and declared ‘externextern float scaley = 5.0;
                  ^
    var.h:42:14: warning: ‘scalez’ initialized and declared ‘externextern float scalez = 5.0;
                  ^
    main.c: In function ‘mon_timer’:
    main.c:31:20: warning: unused parameter ‘val’ [-Wunused-parameter]
     void mon_timer(int val)
                        ^
    main.c: In function ‘keyboard’:
    main.c:41:38: warning: unused parameter ‘x’ [-Wunused-parameter]
     void keyboard(unsigned char key, int x, int y)
                                          ^
    main.c:41:45: warning: unused parameter ‘y’ [-Wunused-parameter]
     void keyboard(unsigned char key, int x, int y)
                                                 ^
    /tmp/ccJrHvkY.o:(.bss+0x0): multiple definition of `joueur1'
    /tmp/ccVwG4vj.o:(.bss+0x0): first defined here
    /tmp/ccJrHvkY.o:(.bss+0x80): multiple definition of `joueur2'
    /tmp/ccVwG4vj.o:(.bss+0x80): first defined here
    /tmp/ccJrHvkY.o:(.bss+0xf0): multiple definition of `parti_fini'
    /tmp/ccVwG4vj.o:(.bss+0xf0): first defined here
    /tmp/ccJrHvkY.o:(.bss+0xf4): multiple definition of `angle'
    /tmp/ccVwG4vj.o:(.bss+0xf4): first defined here
    /tmp/ccJrHvkY.o:(.bss+0xf8): multiple definition of `ex'
    /tmp/ccVwG4vj.o:(.bss+0xf8): first defined here
    /tmp/ccJrHvkY.o:(.bss+0xfc): multiple definition of `ey'
    /tmp/ccVwG4vj.o:(.bss+0xfc): first defined here
    /tmp/ccJrHvkY.o:(.data+0x0): multiple definition of `ez'
    /tmp/ccVwG4vj.o:(.data+0x0): first defined here
    /tmp/ccJrHvkY.o:(.data+0x4): multiple definition of `scalex'
    /tmp/ccVwG4vj.o:(.data+0x4): first defined here
    /tmp/ccJrHvkY.o:(.data+0x8): multiple definition of `scaley'
    /tmp/ccVwG4vj.o:(.data+0x8): first defined here
    /tmp/ccJrHvkY.o:(.data+0xc): multiple definition of `scalez'
    /tmp/ccVwG4vj.o:(.data+0xc): first defined here
    collect2: error: ld returned 1 exit status
    Résultat de ta nouvelle commande.

    Pour le projet il s'agit d'un Console Application et lors du choix du langage je prends bien C.

    J'ai effectué plusieurs tests sur un nouveau projet à (encore plus) petite échelle.
    L'erreur n'est pas présente lorsque j'intègre le second .h dans le header mais lorsque j'appel le header dans le source.c (par exemple)

    Il semble que je n'ai pas fournis mon .c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include "joueur.h"
     
    //joueur initJoueur(joueur j1, joueur j2){
     
     //   return j1;
    //}

  9. #9
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ok, tu mentionnes ce header dans plusieurs unités de compilation (plusieurs .c). Mais tu ne peux pas l'initialiser dans la déclaration car dans ce cas tu pourrais avoir des initialisations distinctes de la même variable. Retires l'initialisation et places-la dans une seule unité de compilation :


    Code foo.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "foo.h"
     
    int bar = 42;

    Code main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
     
    #include "foo.h"
     
    int main(int argc, char *argv[]) {
        printf("%d, %d\n", bar, bar++); // 43, 42
        return 0;
    }

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Ah d'accord donc mon erreur viendrait d'une mauvaise initialisation ?

    Cela m'empêche de pouvoir effectuer des opérations si je comprends bien ?

    Actuellement j'ai une seule initialisation dans mon header.

    Dans mon main.c j'effectue des opérations ou des affectations du type ex = ... ou ex += ... cela pose problème ?

    Ce que je n'arrive pas à expliquer et comprendre c'est lorsque j'enlève #include "var.h" de joueur.h ca fonctionne correctement ...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    En déplaçant en effet l'initialisation dans un .c ca fonctionne. Il a fallu que j'enlève extern tout de même.

    Un grand merci de ton aide en tous cas, et si tu avais encore un peu de temps pour ma question précédente je suis preneur (ou des idées pour améliorer mon projet).

  12. #12
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    L'initialisation n'est pas mauvaise, elle est sitée au mauvais endroit. Comme elle est écrite dans le .h et que tu l'inclus à plusieurs unités de compilation - main.c et joueur.c par exemple - l'éditeur de liens considère que ce sont deux variables distinctes (puisqu'elles ont chacune une initialisation) qui portent le même nom.

    Elle doit être présente une seule fois dans ton programme. La solution la plus évidente est d'écrire un .c dédié comme je l'ai décrit dans mon post précédent.

  13. #13
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par quentinb56 Voir le message
    En déplaçant en effet l'initialisation dans un .c ca fonctionne. Il a fallu que j'enlève extern tout de même.
    Oui extern n'est nécessaire que dans les déclarations - ce qu'il y a dans foo.c est une définition - pour dire au compilateur, en gros : j'annonce que je vais utiliser une variable de tel type qui porte tel nom, mais tu connaîtras les détails de son implémentation plus tard. Sans ce mot-clef, le compilateur considérerait la déclaration comme une définition et créerai une variable globale distincte chaque fois que le .h en question est inclus. C'est ce qui se passait lorsque tu avais l'initialisation sur la même ligne (ce qui avait pour effet d'invalider la présence d'extern).

Discussions similaires

  1. Error multiple definition
    Par guilermo dans le forum Débuter
    Réponses: 4
    Dernier message: 29/09/2009, 13h36
  2. Réponses: 3
    Dernier message: 14/05/2009, 14h19
  3. error : must declare a scalaire variable
    Par ravaid dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/06/2008, 11h52
  4. on error multiple
    Par maxtin dans le forum Général VBA
    Réponses: 2
    Dernier message: 11/10/2007, 00h32
  5. Multiple declaration of "objet_geo"
    Par n00bi dans le forum C++
    Réponses: 4
    Dernier message: 17/11/2005, 21h14

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