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 :

fichier d'entête lu plusieurs fois par g++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut fichier d'entête lu plusieurs fois par g++
    bonjour,

    voici le fichier d'entête:
    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
    #ifndef tables_hpp
    #define tables_hpp
     
    #include <string>
     
    std::string tableAdd[10][10]={
    	{"0","1","2","3","4","5","6","7","8","9"},
    	{"1","2","3","4","5","6","7","8","9","10"},
    	{"2","3","4","5","6","7","8","9","10","11"},
    	{"3","4","5","6","7","8","9","10","11","12"},
    	{"4","5","6","7","8","9","10","11","12","13"},
    	{"5","6","7","8","9","10","11","12","13","14"},
    	{"6","7","8","9","10","11","12","13","14","15"},
    	{"7","8","9","10","11","12","13","14","15","16"},
    	{"8","9","10","11","12","13","14","15","16","17"},
    	{"9","10","11","12","13","14","15","16","17","18"}
    };
     
    std::string tableAddRet[10][10]={
    	{"1","2","3","4","5","6","7","8","9","10"},
    	{"2","3","4","5","6","7","8","9","10","11"},
    	{"3","4","5","6","7","8","9","10","11","12"},
    	{"4","5","6","7","8","9","10","11","12","13"},
    	{"5","6","7","8","9","10","11","12","13","14"},
    	{"6","7","8","9","10","11","12","13","14","15"},
    	{"7","8","9","10","11","12","13","14","15","16"},
    	{"8","9","10","11","12","13","14","15","16","17"},
    	{"9","10","11","12","13","14","15","16","17","18"},
    	{"10","11","12","13","14","15","16","17","18","19"}
    };
     
     
    std::string tableMult[10][10]={
    	{"0","0","0","0","0","0","0","0","0","0"},
    	{"0","1","2","3","4","5","6","7","8","9"},
    	{"0","2","4","6","8","10","12","14","16","18"},
    	{"0","3","6","9","12","15","18","21","24","27"},
    	{"0","4","8","12","16","20","24","28","32","36"},
    	{"0","5","10","15","20","25","30","35","40","45"},
    	{"0","6","12","18","24","30","36","42","48","54"},
    	{"0","7","14","21","28","35","42","49","56","63"},
    	{"0","8","16","24","32","40","48","56","64","72"},
    	{"0","9","18","27","36","45","54","63","72","81"}
    };
     
    std::string tableSous[20][20]={
    	{"0"},
    	{"1","0"},
    	{"2","1","0"},
    	{"3","2","1","0"},
    	{"4","3","2","1","0"},
    	{"5","4","3","2","1","0"},
    	{"6","5","4","3","2","1","0"},
    	{"7","6","5","4","3","2","1","0"},
    	{"8","7","6","5","4","3","2","1","0"},
    	{"9","8","7","6","5","4","3","2","1","0"},
    	{"10","9","8","7","6","5","4","3","2","1","0"},
    	{"11","10","9","8","7","6","5","4","3","2","1","0"},
    	{"12","11","10","9","8","7","6","5","4","3","2","1","0"},
    	{"13","12","11","10","9","8","7","6","5","4","3","2","1","0"},
    	{"14","13","12","11","10","9","8","7","6","5","4","3","2","1","0"},
    	{"15","14","13","12","11","10","9","8","7","6","5","4","3","2","1","0"},
    	{"16","15","14","13","12","11","10","9","8","7","6","5","4","3","2","1","0"},
    	{"17","16","15","14","13","12","11","10","9","8","7","6","5","4","3","2","1","0"},
    	{"18","17","16","15","14","13","12","11","10","9","8","7","6","5","4","3","2","1","0"},
    	{"19","18","17","16","15","14","13","12","11","10","9","8","7","6","5","4","3","2","1","0"}
    };
     
     
     
    #endif
    j'ai bien mis les directives
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef tables_hpp
    #define tables_hpp
    #endif
    g++ me répond:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /tmp/cc6qvIEd.o:(.bss+0x0): définitions multiples de « tableAdd »
    /tmp/ccvYQNRP.o:(.bss+0x0): défini pour la première fois ici
    /tmp/cc6qvIEd.o:(.bss+0x1c0): définitions multiples de « tableAddRet »
    /tmp/ccvYQNRP.o:(.bss+0x1c0): défini pour la première fois ici
    /tmp/cc6qvIEd.o:(.bss+0x380): définitions multiples de « tableMult »
    /tmp/ccvYQNRP.o:(.bss+0x380): défini pour la première fois ici
    /tmp/cc6qvIEd.o:(.bss+0x540): définitions multiples de « tableSous »
    /tmp/ccvYQNRP.o:(.bss+0x540): défini pour la première fois ici
    collect2: error: ld returned 1 exit status
    quelqu'un a une idée?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Tu dois séparer la déclaration de la définition; cette dernière doit être dans un .cpp, alors que la déclaration reste dans le .h
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    j'ai oublié de préciser que le nom du fichier est "tables.hpp"

    il n'y a pas de fonctions (ni déclarations, ni définitions). Il n'y a que des tableaux initialisés.

    je ne comprend vraiment pas.pourquoi ça fait ça.

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    En fait il s'agit des déclarations et définitions des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Déclaration
    /*extern*/ T t;
    // Définition
    t = T();
    // Déclaration + Définition
    T t = T();
    Pour la déclaration, il me semble que tu peux utiliser extern ou faire une variable static de classe.

    Une autre solution, pour tout laisser dans le fichier d'entête, est de faire retourner ta variable par une fonction inline.
    (En C++17, tu pourrais directement utiliser inline sur les variables.)

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Ca va plus loin, sans le mot clé extern, même sans initialiseur, une variable est définie (éventuellement à une valeur arbitraire).

    Il y a une alternative, l'inclure dans un namespace anonyme. Tu auras juste plusieurs copies, une dans chaque fichier incluant l'en-tête.

    En tout cas, une variable globale est toujours une cause de problèmes.

  6. #6
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    j'ai compris ce qu'il s'est passé: on ne peut pas mettre des variables (ici des tableaux) dans un fichier d'entête et de #include "fichier.hpp (avec des variables)" dans plus d'un autre fichier.

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

Discussions similaires

  1. [Débutant] Mon fichier Excel s'ouvre plusieurs fois en lecture seule
    Par Ougmios dans le forum Visual Studio
    Réponses: 0
    Dernier message: 02/09/2014, 17h49
  2. Eclipse plante plusieurs fois par jour
    Par rc_29 dans le forum Eclipse
    Réponses: 2
    Dernier message: 28/06/2011, 08h48
  3. [RegEx] Détection d'une chaine présente plusieurs fois par ligne
    Par Tchupacabra dans le forum Langage
    Réponses: 6
    Dernier message: 03/07/2009, 16h54
  4. Réponses: 7
    Dernier message: 24/08/2007, 14h29
  5. Réponses: 4
    Dernier message: 02/09/2004, 21h43

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