2012-06-17 9 views
14

Mam 4 pliki (2 nagłówki i 2 pliki kodu). FileA.cpp, FileA.h, FileB.cpp, FileB.hC++ wiele definicji zmiennej

FileA.cpp:

#include "FileA.h" 

int main() 
{ 
    hello(); 
    return 0; 
} 

void hello() 
{ 
    //code here 
} 

FileA.h:

#ifndef FILEA_H_ 
#define FILEA_H_ 
#include "FileB.h" 
void hello(); 

#endif /* FILEA_H_ */ 

FileB.cpp:

#include "FileB.h" 

void world() 
{ 
    //more code; 
} 

FileB.h:

#ifndef FILEB_H_ 
#define FILEB_H_ 

int wat; 
void world(); 


#endif /* FILEB_H_ */ 

kiedy próbuję skompilować (z zaćmieniem), otrzymuję "wiele definicji" wat "" I nie wiem dlaczego, wydaje się, że powinna działać dobrze.

+4

Witamy w świecie łączenia .. –

Odpowiedz

22

ja nie zamierzam zawierać wszystkie szczegóły, ale można zdefiniować zmienną globalną, wat dwukrotnie w swojej kompilacji uint.

Aby rozwiązać, należy wykonać następujące czynności:

FileB.h

extern int wat; 

FileB.cpp

int wat = 0; 

To (extern) informuje, że zmienna kompilacji wat istnieje gdzieś, i że musi znaleźć go na jego własne (w tym przypadku, to w FileB.cpp)

+0

Czy ma wpływ na optymalizację zmiennych "const"? Czy optymalizacja kompilatora jest uruchamiana na etapie kompilacji lub na etapie łączenia? – ar2015

0

Deklaracja zmiennej wat jest definicją, która powinna należeć do pliku cpp. To tak, jakbyś umieścił swoje ciała funkcyjne w nagłówku.

Musisz umieścić extern przed deklaracją wat i skopiuj bieżącą deklarację bez extern do jednego z plików cpp.

3

Otrzymujesz wiele definicji ponieważ wat jest zadeklarowany w zasięgu pliku i staje się widoczny dwa razy w 2 plikach źródłowych.

Zamiast tego ustaw zmienną declartion extern i zdefiniuj ją dokładnie w pliku źródłowym jeden.

extern int wat; // In FileB.h 

int wat; // In FileB.cpp 
1

Znalazłem odpowiedź teraz (chyba patrząc na pliki jeden po drugim pomogły) Problemem jest to, że kompilator tworzy FileB.o, który ma definicję wat, , a następnie próbuje skompilować FilB.o z FileA.cpp, podczas gdy FileA.h ma włącznik FileB.h będzie teraz miał także definicję wat.

+0

I tylko jeden pojedynczy plik blabla.h z włączonymi strażnikami (#ifndef xxx_H ...) i jedną zmienną globalną. Podczas kompilacji otrzymałem wiele definicji błędu "myglobal_variable". –

6

Nie zadeklaruj zmiennej w nagłówku. #include dosłownie kopiuje i wkleja zawartość pliku do innego pliku (to znaczy, że dowolny plik, który ma #include "FileB.h", dosłownie kopiuje do niego zawartość FileB.h, co oznacza, że ​​int wat jest zdefiniowany w każdym pliku, który ma #include "FileB.h").

Jeśli chcesz uzyskać dostęp do wat z FileA.cpp i jest on zadeklarowany w FileB.cpp, możesz oznaczyć go jako extern w FileA.cpp.

Powiązane problemy