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 definitions of var..


Sujet :

C++

  1. #1
    Membre éclairé Avatar de knoodrake
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 86
    Par défaut multiple definitions of var..
    Bonjour,
    Cela fait plus d'une heure que je bataille sur un problème, sans doute très bête: J'ai une variable dont j'ai besoin dans plusieurs fichiers différents, et j'arrive soit à les inclure plusieurs fois (et le linker crie) , soit pas du tout (et donc le compilo crie)

    Bon, je vais essayer de simplifier au maximum la struture des fichiers concernés; la liste des fichiers avec leurs includes et fonctions:

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include "const.cpp"
    int main () { 
       fctn();
    }
    const.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "call.h"
    unType mavar
    int fctn () {
       // utilisation de mavar
    }
    call.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include "call.h"
    int call::call_fctn () {
        // utilisation de mavar
    }
    call.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    namespace call {
       int call_fctn ();
    }
    Note: var est un objets d'une classe que je n'ai pas jugé utile de présenter ici.

    Le Makefile quant à lui pourrai se résumer à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gcc -c call.cpp
    gcc -lcall main.cpp -o exec.bin
    Mais non. Les résultats auquels j'arrive sont ( en bougeant mavar de fichier en fichier ) soit mavar n'a pas été déclaré dans main.cpp, soit pas déclaré dans call.cpp, soit au moment de lier, dans main.cpp: mavar a déja été déclaré avant dans call.cpp

    une idée ?

    J'espere ne pas avoir trop simplifié le code et avoir fait disparaitre le probleme

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Mei,

    1) On n'inclut pas de fichiers .cpp, revois la conception de tes fichiers

    2) Pour ton problème, regarde le mot-clé extern

  3. #3
    Membre éclairé Avatar de knoodrake
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 86
    Par défaut
    Merci pour ta réponse.
    J'ai un peu galeré, mais les extern furent effectivement la solution.
    Et j'ai revu mes fichiers, parce que si tu me dit qu'inclure des .cpp c'est mal

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Les fichiers cpp, contrairement aux fichiers h, sont des unités de compilation. Par défaut, le compilateur a comme règle de toujours les compiler au maximum (nb : pour le cas de définition des membres d'un template, il ne compilera pas grand chose).

    Du coup, si tu inclus un cpp dans un autre, la méthode membre Exemple::Exemple() sera compilée par le premier cpp, puis par le second et le linker ne saura pas choisir.

    De même, si tu définis (et non pas juste déclarer) une fonction dans un .h, tu vas avoir le même problème de multiple définition lors du link si ton .h est inclut par plus d'une unité de compilation. Dans ce cas, il faut rendre ces fonctions inline.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/09/2006, 15h42
  2. Multiple definition
    Par vdumont dans le forum C++
    Réponses: 6
    Dernier message: 11/05/2006, 19h21
  3. multiple definition of operator<<...
    Par kleenex dans le forum C++
    Réponses: 3
    Dernier message: 05/05/2006, 02h56
  4. [LG]Interfaces et multiples définitions
    Par fatt dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2004, 22h41
  5. multiple definition
    Par scorbo dans le forum C
    Réponses: 5
    Dernier message: 10/09/2003, 13h16

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