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 ++
À côté de cette: