Múltiples declaraciones y definiciones.

Contenido de Xc :

 int i; main () { fun (); } 

Contenido de Yc :

 int i; fun () { } 

¿Por qué estos dos archivos se comstackn sin error? (utilizando GCC)

Pero si uso int i = 10; imprime un error de definición múltiple.

Usted puede estar interesado en esta pregunta y las respuestas. Palabras clave: “definición provisional”.

Definiciones provisionales en C99 y vinculación.

Suponiendo que realmente desea una variable independiente llamada i en cada uno de estos dos archivos, debe prefijarlos con static para darles un enlace interno.

 static int i = 10; 

Si quiere que yo sea la misma variable en ambos archivos, para que los cambios en uno afecten al otro, use las respuestas que recibió hace 3 horas cuando hizo una variante de la pregunta. Si se va a compartir, debe definir la variable en un lugar.

En cuanto a por qué no causó un error sin el inicio, creo que es porque no estaba usando la variable hasta que necesitó inicializarse y el comstackdor la ignoró.

Porque hay una diferencia entre una statement y una definición. int i; no hace nada más que introducir un nombre. int i = 10; por otro lado define i , por lo tanto, un lugar en la memoria debe reservarse para almacenar el valor al que corresponde. Pero es imposible para el comstackdor saber qué valor corresponde a i ya que desea asociar dos ubicaciones de memoria con el nombre i .

Esto es bajo el supuesto de que usted vincula estos archivos entre sí, lo que no queda completamente claro a partir de su explicación.