c ++ múltiples definiciones de una variable

Tengo 4 archivos (2 encabezados y 2 archivos de código). FileA.cpp, FileA.h, FileB.cpp, FileB.h

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 bash comstackr (con eclipse), obtengo “definición múltiple de` wat ‘”Y no sé por qué, parece que debería funcionar bien.

No voy a incluir todos los detalles, pero define una variable global, wat dos veces en su comstackción.

Para solucionarlo, usa lo siguiente:

FileB.h

 extern int wat; 

FileB.cpp

 int wat = 0; 

Este ( extern ) le dice a la comstackción que la variable wat existe en alguna parte , y que necesita encontrarla por sí misma (en este caso, está en FileB.cpp )

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

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

Obtiene definición múltiple porque wat se declara en el scope del archivo y get visible dos veces en los 2 archivos fuente.

En su lugar, haga que la statement de la variable sea extern y defínala en exactamente un archivo fuente.

 extern int wat; // In FileB.h int wat; // In FileB.cpp 

Encontré la respuesta ahora (creo que mirar los archivos ayudados uno tras otro) El problema es que el comstackdor crea un FileB.o que tiene una definición de wat, y luego intenta comstackr FilB.o con FileA.cpp, mientras FileA.h tiene una inclusión de FileB.h ahora también tendrá una definición de wat.

Esa statement 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 statement wat y copiar su statement actual sin extern en uno de los archivos cpp.