Meerdere definitie van … linkerfout

Ik heb een speciaal bestand gedefinieerd: config.h

Mijn project heeft ook bestanden:

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

en #includes:

in t.c:

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

in bc:

   #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"

er zijn geen include-instructies in mijn *.h-bestanden, alleen in *.c-bestanden. Ik definieerde dit in config.h:

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

en heb die array nodig in l.cpp, t.c, pp.c maar ik krijg deze foutmelding:

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

Ik heb bewakers opgenomen in elk *.h-bestand dat ik in mijn project gebruik. Hulp om dit op te lossen?


Antwoord 1, autoriteit 100%

Definieer geen variabelen in kopteksten. Zet declaraties in header en definities in een van de .c-bestanden.

In config.h

extern const char *names[];

In een .c-bestand:

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

Als u een definitie van een globale variabele in een headerbestand plaatst, gaat deze definitie naar elk .c-bestand dat deze header bevat, en krijgt u een meervoudige definitiefout omdat een variabele meerdere keren kan worden gedeclareerd, maar kan worden slechts één keer gedefinieerd.

Bovendien kun je nog een ding doen als je je variabelen in een headerbestand moet definiëren, je kunt het trefwoord staticgebruiken.

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

Op deze manier worden variabele namesslechts één keer gedefinieerd in uw hele programma en zijn ze meerdere keren toegankelijk.


Antwoord 2, autoriteit 29%

Declaraties van publieke functies gaan in header-bestanden, ja, maar definities zijn ook absoluut geldig in headers! Je mag de definitie als statisch declareren (slechts 1 kopie toegestaan voor het hele programma) als je dingen definieert in een header voor hulpprogramma-functies die je niet opnieuw in elk c-bestand wilt moeten definiëren. D.W.Z. het definiëren van een opsomming en een statische functie om de opsomming te vertalen naar een string. Dan hoef je de enum to string-vertaler niet te herschrijven voor elk .c-bestand dat de header bevat. 🙂

Other episodes