2013-04-02 19 views
5

Ho un file di intestazione 'USpecs.h':multipla Definizione di "..." c

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


#include <iostream> 
#include <vector> 

std::vector<Specs*> UcakSpecs; 


#endif 

Sto usando questa intestazione sia in funzione principale e un altro classe denominata Ucak.

Ma quando costruisco verifica il seguente errore:

Ucak.cpp | 6 | definizione multiplo di `UcakSpecs' |

Come ho cercato prima, va bene con #ifndef ma non lo è.

+0

Si prega di mostrare il file di codice CPP –

+0

C'è una errore di battitura sul primo "include". Inoltre, se questo non è 'Specs.h' (dal momento che lo stai includendo), che cos'è? – slezica

risposta

8

Le protezioni di inclusione impediscono solo più definizioni all'interno di una singola unità di traduzione (vale a dire un singolo file sorgente con le intestazioni incluse). Non impediscono più definizioni quando si include l'intestazione da più file di origine.

Invece, si dovrebbe avere una dichiarazione nell'intestazione:

extern std::vector<Specs*> UcakSpecs; 

e una definizione a uno (e uno solo) file sorgente:

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

funziona. Grazie. – mucisk

4

Le protezioni di inclusione impediscono l'inclusione della testata nella stessa unità di traduzione più di una volta. Se includi questa intestazione in più unità di traduzione, avrai più definizioni di UcakSpecs in tutto il programma.

Il modo per dichiarare una variabile globale è di dichiararla come extern nel file di intestazione:

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


#include <iostream> 
#include <vector> 

extern std::vector<Specs*> UcakSpecs; 

#endif 

Una variabile globale dichiarata come extern è solo una dichiarazione.

Quindi assicurarsi che sia definito solo in una singola unità di traduzione definendolo in un file di implementazione (forse in USpecs.cpp);

std::vector<Specs*> UcakSpecs; 
3

Il #ifndef si applica solo a una singola unità di compilazione. Dato che ne hai due (la funzione principale e la classe Ucak), la variabile viene definita due volte.

consideri dichiarare la variabile come extern nel file di intestazione:

extern std::vector<Specs*> UcakSpecs; 

e definendolo all'interno del file Ucak.cpp:

std::vector<Specs*> UcakSpecs; 

Questo dovrebbe funzionare.