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. 🙂