webentwicklung-frage-antwort-db.com.de

Mehrfachdefinition von ... Linker-Fehler

Ich habe eine spezielle Datei definiert: config.h

Mein Projekt hat auch Dateien:

t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp

und #umfasst:

in t.c:

    #include "t.h"
    #include "b.h"
    #include "pp.h"
    #include "config.h"

in b.c:

    #include "b.h"
    #include "pp.h"

in pp.c:

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

in l.cpp:

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

meine *.h - Dateien enthalten keine Include-Anweisungen, sondern nur *.c - Dateien. Ich habe dies in config.h definiert:

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

und brauche das Array in l.cpp, t.c, pp.c, aber ich erhalte diesen Fehler:

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

Ich habe in jede *.h - Datei, die ich in meinem Projekt verwende, Wachen eingeschlossen. Irgendeine Hilfe, um das zu lösen?

40
mazix

Definieren Sie keine Variablen in Überschriften. Fügen Sie Deklarationen in Header und Definitionen in eine der C-Dateien ein.

In config.h

extern const char *names[];

In einer .c-Datei:

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

Wenn Sie eine Definition einer globalen Variablen in eine Header-Datei einfügen, wird diese Definition in jede .c-Datei verschoben, die diesen Header enthält, und es wird ein Fehler bei der Mehrfachdefinition angezeigt, da eine Variable möglicherweise mehrmals deklariert, aber nur einmal definiert werden kann .

96
Yu Hao

Deklarationen von öffentlichen Funktionen gehen in Header-Dateien, ja, aber Definitionen sind auch in Headern absolut gültig! Sie können die Definition als statisch deklarieren (nur 1 Kopie für das gesamte Programm zulässig), wenn Sie in einem Header Funktionen für Dienstprogramme definieren, die Sie nicht in jeder c-Datei neu definieren müssen. I.E. Definieren einer Aufzählung und einer statischen Funktion, um die Aufzählung in einen String zu übersetzen. Dann müssen Sie das enum to string translator nicht für jede .c-Datei, die den Header enthält, neu schreiben. :)

25