Plusieurs symboles définis erreur C ++

Je pensais que ifndef something #define something body #endif résolu cette erreur, je ne suis donc pas sûr de savoir pourquoi cela se produit.

 //Library.h #ifndef __LIBRARY__ #define __LIBRARY__ #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  //file includes #include "Globals.h" using namespace std; #endif //__LIBRARY__ 

 //globals.h //global variables #ifndef __GLOBAL__ #define __GLOBAL__ #include  #include  #include  //prototypes bool Poglathon(std::vector& text); void NPCTalk(std::ssortingng const& speaker,std::vector const& text); void wait(double seconds); //player stats std::ssortingng name; double str; //strength double wis; //wisdom double ref; //reflex double hp; //health points double i; //initiative double inte; //intelligence double c; //courage int gold; //gold int xp; //experience int ap; //armour points int wd; //weapon damage int lvl; //level int sp; //skill points #endif //__GLOBAL__ 

Ensuite, il y a deux autres fichiers cpp qui incluent “Library.h”.

Le problème est que dans votre fichier d’en-tête globals.h, vous déclarez une suite de variables qui, par défaut, ont un lien externe: à savoir, tous les globals!

Lorsque vous prototypez une fonction dans un fichier d’en-tête, vous déclarez une fonction mais ne la définissez pas. Il est parfaitement légal d’avoir plusieurs déclarations de la même fonction. C’est pourquoi, si plusieurs fichiers différents incluent tous le même # en-tête et déclarent la même fonction, tout va bien. D’autre part, si vous avez des variables globales dans un fichier d’en-tête, vous définissez ces variables. Les variables ne peuvent être définies qu’une seule fois en C ++ (c’est la règle de définition unique ). Si plusieurs fichiers définissent la même variable ou la même fonction, cela provoquera une erreur de l’éditeur de liens car celui-ci ne saura pas quelle version utiliser. C’est la raison pour laquelle, en passant, vous n’incluez pas les fichiers .cpp, car si vous le faisiez, vous définiriez toutes les fonctions exscopes par cet en-tête.

Pour résoudre ce problème, dans l’en-tête, vous voudrez modifier ces définitions de variable en déclarations de variable à l’aide du mot clé extern :

 //player stats extern std::ssortingng name; extern double str; //strength extern double wis; //wisdom extern double ref; //reflex extern double hp; //health points extern double i; //initiative extern double inte; //intelligence extern double c; //courage extern int gold; //gold extern int xp; //experience extern extern int ap; //armour points extern int wd; //weapon damage extern int lvl; //level extern int sp; //skill points 

Cela permettra à un nombre quelconque de fichiers d’ #include cet en-tête, car aucun d’entre eux ne définit réellement les variables; ils déclarent simplement que les variables existeront quelque part. Ensuite, vous devriez créer un nouveau fichier .cpp, probablement globals.cpp, qui définit réellement les variables:

 #include "globals.h" std::ssortingng name; double str; //strength double wis; //wisdom double ref; //reflex double hp; //health points double i; //initiative double inte; //intelligence double c; //courage int gold; //gold int xp; //experience int ap; //armour points int wd; //weapon damage int lvl; //level int sp; //skill points 

Ce sont les définitions réelles des variables, et comme elles n’existent qu’à un seul endroit (globals.cpp), vous ne recevrez plus d’erreurs d’éditeur de liens.

J’espère que cela t’aides!

Il y a beaucoup de problèmes avec votre code C ++

  • Ne jamais déclarer les variables globales directement dans l’en-tête, c’est ce qui déclenche les multiples symboles tels qu’ils apparaîtront dans chaque unité de compilation (fichier ~ cpp les utilisant) Une solution serait de les rendre externes, mais je vous encourage vivement à utiliser une classe ou une structure tenant ces parameters à la place.

À côté de cette:

  • Ne faites jamais “using namespace xxx” dans les fichiers d’en-tête de la scope globale. Vous obligerez tous ceux qui utilisent l’en-tête à extraire les symboles à l’intérieur de l’espace de noms global.
  • Il ne suit pas la sémantique C ++, ressemble plus à C (je voudrais vraiment envelopper toutes les statistiques de joueur dans une classe du même nom!)