Définition multiple de… erreur de l’éditeur de liens

J’ai défini un fichier spécial: config.h

Mon projet contient également des fichiers:

 tc, th pp.c, pp.h bc bh l.cpp 

et # comprend:

en tc:

  #include "th" #include "bh" #include "pp.h" #include "config.h" 

en bc:

  #include "bh" #include "pp.h" 

en pp.c:

  #include "pp.h" #include "config.h" 

dans l.cpp:

  #include "pp.h" #include "th" #include "config.h" 

il n’y a pas de directives d’inclusion dans mes fichiers *.h , seulement dans les fichiers *.c . J’ai défini ceci dans config.h:

 const char *names[i] = { "brian", "stefan", "steve" }; 

et besoin de ce tableau dans l.cpp, tc, pp.c mais je reçois cette erreur:

 pp.o:(.data+0x0): multiple definition of `names' lo:(.data+0x0): first defined here to:(.data+0x0): multiple definition of `names' lo:(.data+0x0): first defined here collect2: ld returned 1 exit status make: *** [link] Error 1 

J’ai inclus des gardes dans chaque fichier *.h que j’utilise dans mon projet. Toute aide pour résoudre cela?

Ne définissez pas de variables dans les en-têtes. Placez les déclarations dans l’en-tête et les définitions dans l’un des fichiers .c.

Dans config.h

 extern const char *names[]; 

Dans certains fichiers .c:

 const char *names[] = { "brian", "stefan", "steve" }; 

Si vous mettez une définition d’une variable globale dans un fichier d’en-tête, cette définition ira à tous les fichiers .c incluant cet en-tête, et vous obtiendrez une erreur de définition multiple, car une variable sera déclarée plusieurs fois mais ne pourra être définie qu’une seule fois .

Les déclarations de fonctions publiques vont dans les fichiers d’en-tête, oui, mais les définitions sont également absolument valables dans les en-têtes! Vous pouvez déclarer la définition statique (une seule copie autorisée pour l’ensemble du programme) si vous définissez des éléments dans un en-tête pour des fonctions utilitaires que vous ne souhaitez pas définir à nouveau dans chaque fichier c. IE définissant une énumération et une fonction statique pour la traduire en chaîne. Ensuite, vous n’aurez pas à réécrire le traducteur enum en chaîne pour chaque fichier .c incluant l’en-tête. 🙂