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 :

multiple definition


Sujet :

C

  1. #1
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut multiple definition
    Hi,

    J'ai un petit problème:
    j'utilise dev-c++ 4.9.8.0, j'ai créer un projet qui inclus 3 fichiers c et un fichier h. Dans chaque fichier c j'ai inclue le fichier h. Au tout début de ce dernier j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef _PROG_H
    #define _PROG_H 1
    ....
    ....
    #endif
    Le problème c'est que lors de la compilation il écrit "multiple definition of"...

  2. #2
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    a priori ca a l'air bon, mais :
    - c'est quoi le message en entier ? (copier/coller apprecie )
    - tu ne le definis (_PROG_H) pas ailleurs par hasard ?
    - t'es sur que c'est bien PROG_H qui est "multiple definition..." ?

  3. #3
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 351
    Points : 130 312
    Points
    130 312
    Billets dans le blog
    1
    Par défaut Re: multiple definition
    Ton message d'erreur n'est pas normal, cependant, pour éviter une multi-inclusion, on ne définit pas de valeur au #define :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef _PROG_H
    #define _PROG_H
    ....
    ....
    #endif
    Cela t'évitera le message d'erreur, mais cela ne résoudra pas le problème : si le problème est sur _PROG_H, c'est qu'il n'est pas unique dans ton programme (et donc ton .h risque de ne pas être compilé).

  4. #4
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    voilà le fichier .h
    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
     
    #ifndef _PROG_H
    #define _PROG_H 1
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk-2.0/gtk/gtk.h>
     
    #define W_DAREA 300
    #define H_DAREA 300
     
    GtkWidget* window;
    GtkWidget *darea;	/* drawing area */
    GdkPixmap *darea_pxm;	/* backing pixmap for darea */
    GdkGC *darea_gc;	/* attached Graphics Context */
    GdkPixmap *brique1_xpm;
     
     
     
    void key_press_event (GtkWidget *widget, GdkEventKey *event);
    int expose_event(GtkWidget *widget, GdkEventExpose *event);
    void load_pixmaps(void);
    void init_var(void);
     
    int level = 0;
     
    #endif
    - La variable _PROG_H n'est définit que dans le fichier .h
    - Les messages d'erreurs sont:

    multiple definition of 'level'
    multiple definition of 'window'
    multiple definition of 'darea'

    Et ainsi de suite pour toutes les variables déclarées dans le fichier .h

  5. #5
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Dans ton .h, il faut definir les variables comme extern (extern int i. Et il faut definir dans un (et un seul) des .c ces memes variables.

    Explications:
    le .h est normalement uniquement la pour definir des types/variables, mais pas pour les "implementer". Or toi, avec cette definition (sans extern), lorsque tu compiles tes 3 .c independamment, tu ajoute dans les .o associes les variables du .h
    Le include n'est qu'une recopie d'un fichier. Le #ifndef n'est la que pour eviter les inclusions recursives (lors de la compilation d'un seul .c), pas pour gerer les variables "globales".

    Exemple (mauvais):
    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
    <commun.h>
    #ifndef __COMMUN_H__
    #define __COMMUN_H__
    int glob_var;
    #endif
     
    <toto.c>
    #include "commun.h"
    int main(void){
        tata(3);
        printf("glob_var=%d\n",glob_var);
        return 0;
    }
     
    <tata.c> 
    #include "commun.h"
     
    void tata(int i){
        glob_var=i;
        return;
    }
    Lors de la compilation de toto.c, le compilo voit ca (apres le pre-processeur (gcc -E)) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int glob_var;
     
    int main(void){
        tata(3);
        printf("glob_var=%d\n",glob_var);
        return 0;
     
    }
    Et lorsqu'il compile tata.c,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int glob_var;
     
    void tata(int i){
        glob_var=i;
        return;
    }
    Et donc lors de l'edition des liens (mettre ensemble les deux .o generes), la variable glob_var est definie 2 fois.

    Exemple (correct):
    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
    <commun.h>
    #ifndef __COMMUN_H__
    #define __COMMUN_H__
    extern int glob_var;
    #endif
     
    <toto.c>
    #include "commun.h"
    int glob_var; /* glob_var sera dans ce .o */
    int main(void){
        tata(3);
        printf("glob_var=%d\n",glob_var);
        return 0;
    }
     
    <tata.c> 
    #include "commun.h"
     
    void tata(int i){
        glob_var=i;
        return;
    }
    Dans ce cas, la variable glob_var sera dans le code de toto.o (espace reserve pour cette variable).

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 57
    Points
    57
    Par défaut
    Ce que dit D[r]eadLock est vrai en C++.
    En C c'est un peu plus compliqué, il existe des definitions potentielles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int x; /* definitions potentiel */
    int x = 0; /* definition */
    extern int x; /* declaration */
    Une variable peu etre declaré autant de fois que l'on veut mais doit etre definie qu'une seule fois.
    Il peu y avoir plusieurs defintions potentielles. L'editeur de lien prend alors la premiere qu'il rencontre comme definition.

    Je vois donc que tu compile avec un compilateur C++ uniquement ou que tu as nomé tes fichiers *.cpp car sinon tu ne devrai avoir qu'une seule erreur :
    multiple definition of 'level'
    car
    int level =0; est la seul vraie definition.

    GtkWidget* window;
    GtkWidget *darea;
    sont de definitions potentielles

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

Discussions similaires

  1. problême de compilation: multiple definition
    Par Plomeg dans le forum C++
    Réponses: 2
    Dernier message: 22/11/2006, 10h17
  2. Réponses: 8
    Dernier message: 19/09/2006, 16h42
  3. Multiple definition
    Par vdumont dans le forum C++
    Réponses: 6
    Dernier message: 11/05/2006, 20h21
  4. multiple definition of operator<<...
    Par kleenex dans le forum C++
    Réponses: 3
    Dernier message: 05/05/2006, 03h56
  5. [LG]Interfaces et multiples définitions
    Par fatt dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2004, 23h41

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