2012-01-23 17 views
11

I m pisania prostych Makefile, który wygląda jak tenstwardnienie definicja przestrzeni nazw zmiennych, C++ kompilacji

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 

I mieć nazwę pliku config.h, który jest wymagany w Mail.cpp i Spambin.cpp, więc mam #include "config.h" w zarówno Mail.cpp i Spambin.cpp. config.h wygląda następująco:

#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 

Może ktoś mi pomóc debugowania to?

+1

I usunęliśmy '[c]' tag ponieważ pytanie ma nic wspólnego z C – NPE

+5

Czy naprawdę masz dwie zmienne ** ** nazywa się i wyłącza ? Czy są te stałe? Jeśli są to stałe, powinieneś je wykonać, a problem zniknie. Zostaniesz z problemem S –

+1

Nie powinieneś używać zastrzeżonych nazw dla swoich strażników. –

Odpowiedz

33

Nie można przypisać zmiennych nazw do plików nagłówkowych. Wykonanie tego definiuje zmienne zamiast tylko deklarując je jako. Umieść to w oddzielnym pliku źródłowym i dodaj to do Makefile i powinno działać.

Edit Ponadto trzeba dokonać deklaracji w pliku nagłówkowym extern.

Więc w pliku nagłówka przestrzeń nazw powinien wyglądać tak:

namespace config{ 
    extern int On; 
    extern int Off; 

    extern double S; 
} 

A w pliku źródłowym:

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

    double S = 1.0; 
} 
+1

Masz na myśli "nie można _initialize_ zmiennych przestrzeni nazw w plikach nagłówkowych"? Nawet ta zmiana nie jest wystarczająca. Deklaracja bez inicjalizatora jest definicją, chyba że 'extern' jest jawnie użyty. –

+0

@CharlesBailey Pamiętam o 'extern' w tym samym czasie, kiedy napisałeś swój komentarz. –

+0

@CharlesBailey domyślnie nie są zmiennymi "zewnętrznymi"? –

2

Spójrz na Variable definition in header files

Musisz umieścić swoje Definicja zmiennej, tzn. przypisanie wartości w pliku źródłowym lub ochrona za pomocą #ifdef guard, gdy nie są zdefiniowane dwukrotnie, gdy są zawarte w oddzielnych plikach źródłowych.

0

W pliku nagłówkowym zadeklaruj const swoje 3 zmienne. Na przykład coś takiego:

#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

Myślę, że problem z tą odpowiedzią jest taki, że jeśli to zrobisz, nie będą już _zmiennikami_. Jednak zastępując stałe '# define', wydaje mi się, że to rozsądny sposób. – meowsqueak

Powiązane problemy