2012-01-23 14 views
11

I m scrivendo un semplice Makefile che assomiglia a questoDefinizione multiplo di variabili spazio dei nomi, la compilazione C++

CC=gcc 
CXX=g++ 
DEBUG=-g 
COMPILER=${CXX} 
a.out: main.cpp Mail.o trie.o Spambin.o 
     ${COMPILER} ${DEBUG} main.cpp Mail.o trie.o Re2/obj/so/libre2.so 

trie.o: trie.cpp 
     ${COMPILER} ${DEBUG} -c trie.cpp 

Mail.o: Mail.cpp 
     ${COMPILER} ${DEBUG} -c Mail.cpp 

Spambin.o: Spambin.cpp 
     ${COMPILER} ${DEBUG} -c Spambin.cpp 

clean: 
     rm -f *.o 

Ho un config.h nome del file che è richiesto in Mail.cpp e Spambin.cpp, quindi ho #include "config.h" in entrambi Mail.cpp e Spambin.cpp. config.h assomiglia a questo:

#ifndef __DEFINE_H__ 
#define __DEFINE_H__ 

#include<iostream> 

namespace config{ 
     int On = 1; 
     int Off = 0; 

     double S = 1.0; 
} 
#endif 

But when I try to compile the code it gives me 
Mail.o:(.data+0x8): multiple definition of `config::On' 
/tmp/ccgaS6Bh.o:(.data+0x8): first defined here 
Mail.o:(.data+0x10): multiple definition of `config::Off' 
/tmp/ccgaS6Bh.o:(.data+0x10): first defined here 

Può uno aiutarmi debug di questo?

+1

Ho rimosso la [c] '' tag in quanto la questione non ha nulla a che fare con C. – NPE

+5

Hai davvero due variabili ** ** chiamati on e off ? O sono quelle costanti? Se sono costanti dovresti renderli tali e il problema andrebbe via. Bene, rimarrebbe il problema di S –

+1

Non dovresti usare nomi riservati per le tue guardie incluse. –

risposta

33

Non è possibile assegnare alle variabili dei nomi in un file di intestazione. Così facendo, definisce le variabili anziché dichiarando. Mettilo in un file sorgente separato e aggiungilo al Makefile e dovrebbe funzionare.

Modifica Inoltre, è necessario effettuare le dichiarazioni nel file di intestazione extern.

Così nel file di intestazione dello spazio dei nomi dovrebbe essere simile a questo:

namespace config{ 
    extern int On; 
    extern int Off; 

    extern double S; 
} 

E nel file di origine:

namespace config{ 
    int On = 1; 
    int Off = 0; 

    double S = 1.0; 
} 
+1

Vuoi dire "non è possibile _initialize_ variabili dello spazio dei nomi nei file di intestazione"? Anche questo cambiamento non è sufficiente. Una dichiarazione senza inizializzatore è una definizione a meno che non venga esplicitamente utilizzato "extern". –

+0

@CharlesBailey Ricordato di "extern" proprio quando hai scritto il tuo commento. –

+0

@CharlesBailey non sono variabili 'extern' di default? –

2

Date un'occhiata a Variable definition in header files

Devi mettere la vostra definizione della variabile, ovvero l'assegnazione del valore in un file sorgente o protezione con un #ifdef guard per non essere definito due volte quando incluso in file sorgente separati.

0

Nel file di intestazione, dichiarare const le 3 variabili. Per esempio, in questo modo:

#ifndef __DEFINE_H__ 
#define __DEFINE_H__ 

#include<iostream> 

namespace config{ 
     const int On = 1; 
     const int Off = 0; 

     const double S = 1.0; 
} 
#endif 
+0

Penso che il problema con questa risposta sia che se lo fai, non sono più _variabili_. Tuttavia, in sostituzione delle costanti di '# define', mi sembra un modo ragionevole di procedere. – meowsqueak

Problemi correlati