2010-05-24 17 views
23

Dodałem pewną stałą postać w moim pliku jako pod. Błąd, który otrzymuję, to zduplikowany symbol _xyz (powiedzmy). Jaki jest problem z tym i jak mogę z tego wyjść.duplikat błędu symbolu C++

const char* xyz = "xyz"; 
class Abc 
{ 
public: 
    Abc() 
    { 
    } 
}; 

Odpowiedz

37

Jeśli jest to w pliku nagłówka, jesteś definiowanie xyz Za każdym razem #include go.

Możesz zmienić deklarację jako @R Samuel Klatchko pokazuje. Zwykłym sposobem (jeśli dane nie są const) jest tak:

W Abc.h:

extern char *xyz; 

W Abc.cpp:

char *xyz = "xyz"; 

Edited by dodać

Należy pamiętać, że osłony nagłówków będą nie rozwiązać ten problem:

Osłony hederów zapobiegają błędom "redefiniowania", w których ten sam symbol pojawia się dwukrotnie w tej samej jednostce kompilacji. To jest błąd kompilatora.

Ale nawet z nagłówka strzeże definicja xyz nadal będzie pojawiać się w każdym pliku źródłowym, który obejmuje ją, powodując błąd „duplikat symbol”, która jest łącznikiembłąd.

Byłoby bardziej pomocne, gdyby oryginalny plakat wspomniał o tym, oczywiście.

+0

Deklarowanie zmiennej wielokrotnie nie jest błędem (jeśli nie znajduje się w tej samej jednostce tłumaczeniowej). Definiując to. –

+0

Powinienem był to złapać, dzięki. – egrunin

+1

Dzięki za wyjaśnienie strażnika. Oto dziwna rzecz - dostaję tylko błąd linkera dla zduplikowanych symboli, jeśli mam funkcję zdefiniowaną w tym nagłówku. W moim obecnym przypadku mam pęczek stałych i kilka funkcji zdefiniowanych w przestrzeni nazw w nagłówku - dostaję tylko błąd linkera dla funkcji, const są OK. Dlaczego? –

-9

Proszę podać szczegółowy opis problemu. Co to jest "mój plik"? Jaką "stałą naturę" zajmujesz?

Za to, co dotychczas dostarczyłaś, mogę tylko zgadywać, że dodałeś powyższą definicję xyz do pliku nagłówkowego, a następnie umieściłeś go w kilku jednostkach tłumaczeniowych. Wynik: obiekt xyz został zdefiniowany więcej niż jeden raz. Stąd błąd.

7

Problem polega na tym, że każdy plik źródłowy zawierający plik nagłówkowy otrzymuje własną kopię xyz z łączem zewnętrznym.

Najprostszym sposobem naprawy jest podanie wewnętrznego powiązania xyz. Możesz to zrobić, ustawiając sam wskaźnik jako stały obok stałej znaku:

const char* const xyz = "xyz"; 
+0

+1 To niewątpliwie najlepsze rozwiązanie. "const" jest zawsze dobre. –

+3

const jest zdecydowanie dobry, ale to po prostu ukrywa problem, że istnieje teraz instancja tych samych danych z każdego pliku. –