2012-06-17 2 views
14

Ho 4 file (2 intestazioni e 2 file di codice). FileA.cpp, FileA.h, FileB.cpp, FileB.hC++ definizioni multiple di una variabile

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_ */ 

quando provo a compilare (con eclissi), ottengo "definizione multipla di 'wat'" E non so perché, sembra che dovrebbe funzionare bene.

+4

Benvenuti nel mondo del collegamento .. –

risposta

22

io non ho intenzione di includere tutti i dettagli, ma si definisce una variabile globale, wat due volte nella vostra uint compilation.

Per risolvere, utilizzare il seguente:

FileB.h

extern int wat; 

FileB.cpp

int wat = 0; 

Questo (extern) racconta la compilazione che la variabile wat esiste da qualche parte, e che ha bisogno di trovare su di essa la propria (in questo caso, è in FileB.cpp)

+0

Influisce sull'ottimizzazione per le variabili 'const'? L'ottimizzazione del compilatore viene eseguita in fase di compilazione o nella fase di collegamento? – ar2015

0

Questa dichiarazione di variabile wat è una definizione che dovrebbe appartenere a un file cpp. È come se tu inserissi i tuoi corpi funzione nell'intestazione.

È necessario inserire extern prima della dichiarazione wat e copiare la dichiarazione corrente senza extern in uno dei file cpp.

3

Si ottiene una definizione multipla perché wat viene dichiarato nell'ambito del file e diventa visibile due volte nei due file di origine.

Invece, rendere la variabile dichiarazione extern e definirla esattamente nello un file sorgente.

extern int wat; // In FileB.h 

int wat; // In FileB.cpp 
1

ho trovato ora la risposta (immagino guardando i file uno dopo l'altro aiutato) Il problema è che il compilatore crea un FileB.o che ha una definizione di wat, e quindi tenta di compilare FilB.o con FileA.cpp, mentre FileA.h ha una inclusione di FileB.h ora avrà anche una definizione di wat.

+0

Ho un solo file blabla.h e include guards (#ifndef xxx_H ...) e una singola variabile globale. Al momento della compilazione ho ottenuto la definizione multipla di errore "myglobal_variable". –

6

Non dichiarare la variabile nell'intestazione. #include copia e incolla letteralmente il contenuto del file nell'altro file (ovvero, qualsiasi file che fa #include "FileB.h" copierà letteralmente il contenuto di FileB.h in esso, il che significa che viene definito in ogni file che contiene #include "FileB.h").

Se si desidera accedere a wat da FileA.cpp ed è dichiarato in FileB.cpp, è possibile contrassegnarlo come extern in FileA.cpp.