2013-07-20 18 views
25

I zdefiniowano specjalny plik: config.hWiele definicji ... błędu łącznikowej

Mój projekt ma też pliki:

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

i właczoną:

w tc:

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

w bc:

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

w pp.c:

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

w l.cpp:

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

istnieją nie obejmują dyrektyw w moich *.h plików, tylko w *.c plików . I to zdefiniowane w config.h:

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

i trzeba ten tablicę w l.cpp TC, pp.c ale Im uzyskiwanie ten błąd:

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 

mam to strażników w każdym pliku *.h Używam w moim projekcie. Każda pomoc w rozwiązaniu tego problemu?

+0

możliwy duplikat błędu [linker definicji wielokrotnej po dodaniu funkcji do pliku łączącego wcześniej] (http://stackoverflow.com/questions/3136616/multiple-definition-linker-error-after-addinga-a- funkcja do wcześniejszego łączenia) –

Odpowiedz

63

Nie definiuj zmiennych w nagłówkach. Umieść deklaracje w nagłówku i definicjach w jednym z plików .c.

W config.h

extern const char *names[]; 

W pewnym pliku .c:

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

Jeśli umieścisz definicję zmiennej globalnej w pliku nagłówka, a następnie definicja ta trafi do każdego. c plik zawierający ten nagłówek, a otrzymasz błąd wielokrotnej definicji, ponieważ zmienna może być zadeklarowana wiele razy, ale można ją zdefiniować tylko raz.

+0

rozwiązany! :) Czy mógłbyś mi powiedzieć dlaczego nie powinieneś umieszczać deklaracji w plikach 'h * .'? – mazix

+3

Więc tego nie zrobi. Używaj plików * .h tylko w celu odniesienia informacji. Musisz pamiętać, że "include" oznacza, że ​​zawiera on wszystkie informacje * .h w tym pliku, więc kopiowałbyś te informacje (nie tylko referencje) do każdego pliku używając * .h.Może to spowodować dezorientację linkerów i tak się dzieje. – Jiminion

+1

@mazix Nie, definicja ** globalnej zmiennej powinna iść do pliku .c i umieścić ** deklarację ** w nagłówku. Pamiętaj, że możesz zadeklarować wiele razy, ale zdefiniuj je tylko raz. –

14

Deklaracje funkcji publicznych przechodzą w plikach nagłówkowych, tak, ale definicje są absolutnie poprawne również w nagłówkach! Możesz zadeklarować definicję jako statyczną (tylko 1 kopia dozwolona dla całego programu), jeśli definiujesz rzeczy w nagłówku dla funkcji narzędzi, których nie chcesz definiować ponownie w każdym pliku c. TO ZNACZY. definiowanie wyliczenia i funkcji statycznej do przetłumaczenia wyliczenia na ciąg znaków. Wtedy nie będziesz musiał przepisywać enum na translator napisów dla każdego pliku .c zawierającego nagłówek. :)

+1

Tak naprawdę ta odpowiedź jest znacznie wygodniejsza niż najlepsza odpowiedź. Wygodniejsze i bardziej atrakcyjne jest posiadanie jednego nagłówka do przechowywania wszystkich zmiennych globalnych, na przykład zamiast plików .h i .cpp. Dziękuję Ci. – Saik

Powiązane problemy