2011-07-30 11 views
7

Mam dwa pliki .cpp w jednym projekcie, main.cpp i myfile.cppKorzystanie struct w innym pliku .cpp

Mam globaly zdefiniowanych struct mystruct w main.cpp, teraz chcę używać tej struktury w myfile.cpp. Kiedy piszę mistyfikację w pliku nagłówkowym i dołączam do obu plików cpp, pojawia się błąd, który mówi o redefinicji tajemnicy. Jak powinienem rozwiązać ten problem.

+0

powinieneś dodać kod, aby uzyskać bardziej szczegółowe odpowiedzi na swoje pytanie. – Matthieu

Odpowiedz

0

Problem polega na tym, że w zasadzie ten sam kod jest dwa razy większy, jeśli widzisz, że uwzględnienie jest po prostu importem kodu.

Można używać #ifdef to naprawić, patrz http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html

+0

Dlaczego zostało to odrzucone? Z tego, co powiedział pytający, jest to najbardziej prawdopodobna odpowiedź: IMO –

0

Należy przesunąć wspólny struct do pliku nagłówka i to, że nagłówek w obu plików. Każde inne rozwiązanie jest obejściem problemu.

0

Deklaracja i definicje to dwie różne rzeczy. Dla twojego przypadku przydzielasz miejsce dla twojej struktury w main.cpp. W swoim nagłówku powinieneś użyć zewnętrznego modyfikatora dla swojej struktury, aby wszystkie pliki zawierające plik nagłówkowy wyglądały w globalnej przestrzeni nazw dla struktury. Mam nadzieję, że to pomoże.

0

standard C/C++ podejście:

// source.h 
Put all struct, class, typedef, macro definitions, extern variable declaraltions 


// source.cpp 
Implement the class, functions, define global/external variables 


// main.cpp, and other parts of program 
#include"source.h" 
+1

@Dawnik, wyjaśnienie przyczyny. Nie rozumiem, co jest nie tak? – Ajay

0

Nagłówek gdzie zadeklarować co twój struct będzie składać się z (prawdopodobnie plik common.h zawartych przez main.cpp i myfile.cpp):

struct MyStruct { 
    int messageID; 
    int tempVariable; 
}; 

W Twój main.cpp, to miejsce, w którym faktycznie używasz struktury:

void someFunction() { 
    struct MyStruct tempStruct; 

    // do something with it 
    tempStruct.messageID = 1; 

} 

Nie podawaj definicji swojego struct zarówno w swoich main.h jak i main.cpp - lub otrzymasz błąd redefinicji!

Nie dołączaj również pliku cpp - dołącz plik nagłówka (np. common.h). Nie wiedząc więcej o strukturze programu, trudno jest uzyskać lepsze informacje.

0

Należy określić strukturę w pliku nagłówkowym tylko, należy usunąć definicję z main.cpp

+0

extern nie jest konieczne, jeśli masz wspólny plik nagłówkowy. Usługa zewnętrzna jest konieczna tylko wtedy, gdy chcesz udostępnić globalny obiekt struct innym użytkownikom. –

+0

@ 0A0D, Rozumiałem dokładnie pytanie OP w ten sposób. Zwróć uwagę na błąd powiązania redefinicji wspomniany w pytaniu. – unkulunkulu

+0

On redefiniuje MyStruct dwa razy .. extern go nie naprawi. Extern oznacza zewnętrzny link. Kompilator zaufa programistce później, że obiekt zostanie zlokalizowany przez linker. W przeciwnym razie wygeneruje błąd linkera. Nie ma błędu linkera. Powinieneś nauczyć się, jak działa extern. –

0

Może można dać więcej informacji na temat tego, co jest rozplanowanie projektu.

Przechodzenie przez przypuszczenie, prawdopodobnie Twój problem może być z dwóch:

  1. chcesz przodu deklarację struktury.

  2. użycie osłony, aby zapobiec redefinicji.

Patrz poniższy link, jak obsługiwać zarówno:

http://www.adp-gmbh.ch/cpp/forward_decl.html

Pliki nagłówkowe również zastosowania obejmują strażników, dzięki czemu można dowiedzieć się, co dokładnie może rozwiązać Twój problem.

0

Jeśli chcesz udostępnić dowolną zmienną między wieloma plikami cpp, powinieneś zadeklarować ją w nagłówku jako extern. I bez extern w jeden z tych plików C++.

Jeśli tego nie zrobisz, będzie brakowało łączenia, ponieważ wiele obiektów będzie mieć zmienną o tej samej nazwie. Zamiast tego podczas używania extern jeden obiekt będzie miał tę zmienną, a inne obiekty ją łączą.

18

Jeśli próbujesz udostępnić definicję struktury wśród kilku jednostek kompilacji (plików cpp), najczęściej stosowaną metodą jest: Umieść definicję swojej struktury w pliku nagłówkowym (mystruct.h). Jeśli struktura zawiera dowolne metody (tzn. Jest to raczej klasa z domyślnie publicznymi elementami członkowskimi), możesz zaimplementować je w pliku mystruct.CPP lub, jeśli są one lekkie, bezpośrednio w strukturze (co powoduje, że są one domyślnie inline).

mystruct.h:

#ifndef MYSTRUCT_H 
#define MYSTRUCT_H 

struct MyStruct 
{ 
    int x; 
    void f1() { /* Implementation here. */ } 
    void f2(); /* Implemented in mystruct.cpp */ 
}; 

#endif 

mystruct.cpp

#include "mystruct.h" 
// Implementation of f2() goes here 
void MyStruct::f2() { ... } 

można używać struct w jak wielu plików cpp, jak chcesz, po prostu #include mystruct.h:

głównym .cpp

#include "mystruct.h" 
int main() 
{ 
    MyStruct myStruct; 
    myStruct.x = 1; 
    myStruct.f2(); 
    // etc... 
} 

Jeśli, z drugiej strony, staramy się dzielić globalny instancji struct w kilku jednostkach kompilacji (nie jest całkowicie jasne, z pytaniem), zrób jak powyżej, ale również dodać

extern MyStruct globalStruct; 

do mystruct .h. To ogłosi, że instancja jest dostępna z zewnętrznym powiązaniem; innymi słowy, że zmienna istnieje, ale jest inicjowana gdzie indziej (w twoim przypadku w mystruct.cpp). Dodaj inicjalizację instancji globalnej do mystruct.cpp:

MyStruct globalStruct;

Jest to ważne. Bez ręcznego utworzenia instancji globalStruct pojawią się błędy linkera . Teraz masz dostęp do globalStruct z każdej jednostki kompilacji zawierającej plik mystruct.h.

Powiązane problemy