2013-04-02 13 views
5

Mam pliku nagłówka "USpecs.h":Multiple Definicja "..." c

#ifndef USPECS_H 
#define USPECS_H 
#include "Specs.h" 


#include <iostream> 
#include <vector> 

std::vector<Specs*> UcakSpecs; 


#endif 

Używam tego nagłówka zarówno w funkcji głównej i innej klasy o nazwie Ucak.

Ale kiedy go zbudować następujący błąd:

Ucak.cpp | 6 | wielokrotnej definicji `UcakSpecs' |

Tak jak wcześniej wyszukiwałam, powinno być w porządku z #ifndef, ale tak nie jest.

+0

Proszę pokazać kod pliku CPP –

+0

istnieje literówka na pierwszym "uwzględnij". Ponadto, jeśli to nie jest 'Specs.h' (od kiedy to dodajesz), co to jest? – slezica

Odpowiedz

8

Dołączone osłony zapobiegają wielokrotnym definicjom w obrębie pojedynczej jednostki tłumaczeniowej (tj. Pojedynczego pliku źródłowego z dołączonymi nagłówkami). Nie zapobiegają wielokrotnym definicjom po dołączeniu nagłówka z wielu plików źródłowych.

Zamiast tego trzeba mieć deklarację w nagłówku:

extern std::vector<Specs*> UcakSpecs; 

i definicji w jednym (i tylko jeden) pliku źródłowego:

std::vector<Specs*> UcakSpecs; 
+0

to działa. dzięki. – mucisk

4

Osłony włączające tylko zapobiegają umieszczaniu nagłówka w tej samej jednostce tłumaczeniowej więcej niż jeden raz. Jeśli umieścisz ten nagłówek w wielu jednostkach tłumaczeniowych, będziesz miał wiele definicji z zakresu UcakSpecs w całym programie.

Sposób zadeklarować zmienną globalną jest zadeklarować ją jako extern w pliku nagłówkowym:

#ifndef USPECS_H 
#define USPECS_H 
#inclde "Specs.h" 


#include <iostream> 
#include <vector> 

extern std::vector<Specs*> UcakSpecs; 

#endif 

Globalna zmienna zadeklarowana jako extern jest tylko deklaracja.

Następnie upewnij się, że jest zdefiniowany tylko w jednej jednostce tłumaczeniowej, definiując go w pliku implementacji (być może w USpecs.cpp);

std::vector<Specs*> UcakSpecs; 
3

Urządzenie #ifndef ma zastosowanie tylko do pojedynczej kompilacji. Ponieważ masz dwa (główna funkcja i klasa Ucak), zmienna jest zdefiniowana dwukrotnie.

Rozważmy deklarując zmienną jako extern w pliku nagłówkowym:

extern std::vector<Specs*> UcakSpecs; 

i zdefiniowanie go wewnątrz pliku Ucak.cpp:

std::vector<Specs*> UcakSpecs; 

to powinno działać.