web-dev-qa-db-fra.com

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:

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?

40
mazix

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

96
Yu Hao

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. :)

25
JonathanWhittenberg