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 of .. first defined here


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 20
    Points : 17
    Points
    17
    Par défaut multiple definition of .. first defined here
    Bonjour,

    J'ai un ordi Windows 64 bits et je programme sous QT Creator. J'ai un problème de compilation lorsque je déclare des variables globales ou définis des fonctions dans un header. Le message est le suivant :
    multiple definition of 'alphabetL'
    first defined here
    Mais je n'ai pas le message avec la variable NAN_E.
    J'ai consulté quelques forums (https://stackoverflow.com/questions/...in-header-file), mais je n'ai pas trop compris.
    On y lit qu'on ne doit pas trop écrire ce genre de code dans un header, mais cela se fait quand même.

    ~~~~~~
    Fichiers.h
    ~~~~~~
    - string.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef STRING_H
    #define STRING_H
     
    #include "graph.h"
    const char* alphabetL = "abcdefghijklmnopqrstuvwxyz"; // il y a un problème.
    ...
    #endif // STRING_H
    - graph.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef GRAPH_H
    #define GRAPH_H
     
    #include "draw.h"
    ...
    #endif // GRAPH_H
    - draw.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef DRAW_H
    #define DRAW_H
     
    #include "list.h"
    ...
    #endif // DRAW_H
    - list.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef LIST_H
    #define LIST_H
     
    #include "math.h"  // It is not <math.h>.
    ...
    #endif // LIST_H
    - math.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef MATH_H
    #define MATH_H
     
    #include "misc.h"
     
    const ent NAN_E   = 0x8000000000000000LL; // Il n'y pas de problème.
    ...
    #endif // MATH_H
    - misc.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef MISC_H
    #define MISC_H
     
    // pas de #include "..."
    #endif // MISC_H
    - main.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef MAIN_H
    #define MAIN_H
     
    #include "../Graph/string.h"
    ...
    #endif // MAIN_H
    ~~~~~~~
    Fichiers.cpp
    ~~~~~~~
    - string.cpp
    - graph.cpp
    - draw.cpp
    - misc.cpp
    - main.cpp
    Est-ce qu'un aurait une solution s'il vous plaît ?
    Merci d'avance.

  2. #2
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 050
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 050
    Points : 8 273
    Points
    8 273
    Par défaut
    Il ne faut pas définir une variable globale dans un fichier entête. Car elle sera définie dans tous les modules où tu as inclus le fichier entête en question.
    Tu la défini dans un fichier source et tu la déclares extern dans le fichier entête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern const char* alphabetL;
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup. ça marche.

    J'ai fini par comprendre :
    1. La variable NAN_E est acceptée parce qu'il n'y a pas de fichier "math.cpp" (il y a juste un fichier "math.h").
    2. La variable alphabetL est dupliquée puisque je mets #include dans le fichier "string.cpp" et puisque "string.h" est aussi compilé.

    Merci encore.

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 580
    Points : 7 703
    Points
    7 703
    Par défaut
    Les variables et les fonctions ne doivent pas être définies dans un entête.

    Il y a des exceptions, les entités qui sont inline, template ou constexpr.
    Et par extension aussi les constantes entières qui sont implicitement considérées comme si on avait utilisé constexpr.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const long long  NAN_E = 0x8000000000000000LL;
    // est vu comme étant
    constexpr long long  NAN_E = 0x8000000000000000LL;      // est constante et est inline
    // Mais
    const double  PI = 3.14159265358979323846264338328;     // PROVOQUE une redéfinition!
    // Alors que
    constexpr double  PI = 3.14159265358979323846264338328; // possible depuis C++20

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup.

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

Discussions similaires

  1. Erreur: first defined here
    Par tengalice49 dans le forum C
    Réponses: 2
    Dernier message: 14/05/2018, 10h28
  2. multiple definition of first defined here
    Par quinroux dans le forum C++
    Réponses: 3
    Dernier message: 19/04/2018, 10h14
  3. Réponses: 27
    Dernier message: 26/03/2008, 08h06
  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