2012-06-17 28 views
14

Tengo 4 archivos (2 encabezados y 2 archivos de código). FileA.cpp, FileA.h, FileB.cpp, FileB.hC++ múltiples definiciones de una variable

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

cuando intento compilar (con eclipse), obtengo "definición múltiple de` wat '" Y no sé por qué, parece que debería funcionar bien.

+4

Bienvenido al mundo de los enlaces ... –

Respuesta

22

no voy a incluir todos los detalles, pero que definir una variable global, wat dos veces en su uint compilación.

Para solucionar, usa la siguiente:

FileB.h

extern int wat; 

FileB.cpp

int wat = 0; 

Este (extern) cuenta la compilación que la variable wat existe en algún lugar, y que necesita para encontrarlo por sí mismo (en este caso, está en FileB.cpp)

+0

¿Influye en la optimización de las variables 'const'? ¿La optimización del compilador se ejecuta en la etapa de compilación o en la etapa de enlace? – ar2015

0

Esa declaración de variable wat es una definición que debería pertenecer a un archivo cpp. Es como si pusiera los cuerpos de su función en el encabezado.

Debe colocar extern antes de la declaración wat y copiar su declaración actual sin extern en uno de los archivos cpp.

3

Obtiene definición múltiple porque wat se declara en el alcance del archivo y se puede ver dos veces en los 2 archivos de origen.

En su lugar, realice la declaración de la variable extern y defínalo exactamente en un archivo fuente.

extern int wat; // In FileB.h 

int wat; // In FileB.cpp 
1

he encontrado la respuesta ahora (supongo que mirar los archivos uno tras otro nos ayudó) El problema es que el compilador crea un FileB.o que tiene una definición de wat, y luego trata de compilar FilB.o con FileA.cpp, mientras que FileA.h tiene una inclusión de FileB.h ahora también tendrá una definición de wat.

+0

Solo tengo un solo archivo blabla.h y con include guard (#ifndef xxx_H ...) y una sola variable global. En tiempo de compilación obtuve la definición múltiple del error 'myglobal_variable'. –

6

No declare la variable en el encabezado. #include literalmente copia y pega el contenido del archivo en el otro archivo (es decir, cualquier archivo que haga #include "FileB.h" literalmente copiará el contenido de FileB.h en él, lo que significa que int wat se define en cada archivo que hace #include "FileB.h").

Si desea acceder a wat desde FileA.cpp, y está declarado en FileB.cpp, puede marcarlo como extern en FileA.cpp.

Cuestiones relacionadas