2012-01-23 21 views
11

Yo escribo un Makefile simple que se parece a estodefinición múltiple de la variable espacio de nombres, C++ compilación

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 

Tengo un config.hy nombre del archivo que se requiere en Mail.cpp y Spambin.cpp, así que tengo #include "config.h" en ambos Mail.cpp y Spambin.cpp. config.h se parece a esto:

#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 

¿Puede cualquiera que me ayude a depurar este?

+1

He eliminado la etiqueta '[c]' ya que la cuestión no tiene nada que ver con C. – NPE

+5

¿Realmente tiene dos variables ** ** llama de encendido y apagado ? ¿O son esas constantes? Si son constantes, conviértelos y el problema desaparecerá. Bueno, se quedaría con el problema de S –

+1

. No debería usar nombres reservados para sus guardias de inclusión. –

Respuesta

33

No se puede asignar a variables de espacio de nombres en un archivo de encabezado. Al hacerlo, define las variables en lugar de solo declarando ellas. Ponlo en un archivo fuente separado y agrégalo al Makefile y debería funcionar.

Editar Además, usted tiene que hacer las declaraciones en el archivo de cabecera extern.

Así que en el archivo de cabecera del espacio de nombres debe tener este aspecto:

namespace config{ 
    extern int On; 
    extern int Off; 

    extern double S; 
} 

Y en el archivo de origen:

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

    double S = 1.0; 
} 
+1

¿Quiere decir "no se pueden _inicializar_ variables de espacio de nombres en archivos de encabezado"? Incluso este cambio no es suficiente. Una declaración sin un inicializador es una definición a menos que se use explícitamente 'extern'. –

+0

@CharlesBailey Recuerdo sobre 'extern' justo al mismo tiempo que escribiste tu comentario. –

+0

@CharlesBailey no son variables 'extern' por defecto? –

2

Tome un vistazo a Variable definition in header files

Usted tiene que poner su definición de variable, es decir, la asignación de valor en un archivo de origen o protegerlo con un #ifdef guard para no ser definido dos veces cuando se incluye en archivos fuente separados.

0

En el archivo de encabezado, declare const sus 3 variables. Por ejemplo, así:

#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

Creo que el problema con esta respuesta es que si haces esto, ya no son _variables_. Sin embargo, como un reemplazo para las constantes '# define', me parece una forma razonable de hacerlo. – meowsqueak

Cuestiones relacionadas