En file1.cc escribo

int i = 0;

Mientras en file2.cc escribo

#include <iostream>

int i = 1;

int main()
{
  std::cout<< i << std::endl;
  return 0;
}

En MacOS, el compilador informa

duplicate symbol _i in:
/var/folders/wn/q9648wb507j9l504vp2d_dwm0000gn/T/file1-bb8eca.o
/var/folders/wn/q9648wb507j9l504vp2d_dwm0000gn/T/file2-b5e667.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Pero, ¿no es que diferentes archivos tienen sus diferentes ámbitos, para que podamos definir una variable global en el archivo 2 con el mismo nombre que en el archivo 1? Además, si diferentes archivos están en el mismo ámbito, entonces ¿por qué es ilegal transformar file2.cc como:

#include <iostream>

int main()
{
  std::cout<< i <<std::endl;
  return 0;
}
c++
2
Felix 23 dic. 2016 a las 16:40

3 respuestas

La mejor respuesta

No se permiten múltiples definiciones de la misma variable global. Debe marcar sus variables static, const o colocarlas en un espacio de nombres anónimo. De lo contrario, están en el ámbito global.

Y su segunda pregunta: el código de ejemplo no se compila, porque el compilador no ve la variable global del otro archivo, porque un compilador compila una unidad de traducción (archivo C ++) a la vez. Es por eso que necesita agregar extern i;. Esto le dice al compilador que la variable se definirá en otra unidad de traducción.

Después de que todos los archivos se hayan compilado correctamente, se vincularán. Linker verifica todas las unidades de traducción. Cuando obtiene un error sobre varias definiciones, este error ocurre durante el enlace.

6
vll 23 dic. 2016 a las 13:59

El alcance global para los archivos vinculados en el mismo ejecutable es el mismo. Para evitar eso, puede declararlo static, pero eso está en desuso en c ++.
La forma correcta de separar el alcance de los dos archivos es usar espacios de nombres.

1
Nogoseke 23 dic. 2016 a las 13:49

Su variable está en el mismo alcance. Debe usar espacios de nombres para declarar variables con el mismo nombre.

1
Darth Coder 23 dic. 2016 a las 13:50