J'ai défini un fichier spécial: config.h
Mon projet contient également des fichiers:
t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp
et # comprend:
en t.c:
#include "t.h"
#include "b.h"
#include "pp.h"
#include "config.h"
en b.c:
#include "b.h"
#include "pp.h"
en pp.c:
#include "pp.h"
#include "config.h"
dans l.cpp:
#include "pp.h"
#include "t.h"
#include "config.h"
il n'y a pas de directives d'inclusion dans mon *.h
fichiers, uniquement dans *.c
des dossiers. J'ai défini ceci dans config.h:
const char *names[i] =
{
"brian", "stefan", "steve"
};
et besoin de ce tableau dans l.cpp, t.c, pp.c mais je reçois cette erreur:
pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1
J'ai inclure des gardes dans chaque *.h
fichier 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 définissez une variable globale dans un fichier d’en-tête, cette définition s’appliquera à tous les fichiers .c contenant 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. C'EST À DIRE. définir 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. :)