un “símbolo duplicado” esperado no ocurre cuando falta “extern”

En archivo1.c

int i; foo1() { ..... } 

En archivo2.c

 int i=10; foo2() { ..... } 

Luego, cuando gcc file1.c file2.c . Se hizo exitoso, lo cual creo que es imposible porque creo que habrá un duplicate symbol del comstackdor. Entonces, ¿alguien puede decirme por qué mi código fue construido exitosamente sin usar ” extern “? ¿Y hay alguna diferencia entre C y C ++ en esta situación?

El progtwig no es válido. Una extensión de GCC permite que GCC la acepte.

Para desactivar la extensión, use la bandera -fno-common .

La documentación de GCC dice:

-fno-common

En el código C, controla la colocación de variables globales no inicializadas. Los comstackdores de Unix C tradicionalmente han permitido múltiples definiciones de tales variables en diferentes unidades de comstackción al colocar las variables en un bloque común. Este es el comportamiento especificado por -fcommon , y es el predeterminado para GCC en la mayoría de los destinos. Por otro lado, ISO C no exige este comportamiento, y en algunos objectives puede conllevar una velocidad o una penalización de tamaño de código en las referencias de variables. La opción -fno-common especifica que el comstackdor debe colocar variables globales sin inicializar en la sección de datos del archivo de objeto, en lugar de generarlas como bloques comunes. Esto tiene el efecto de que si la misma variable se declara (sin extern ) en dos comstackciones diferentes, obtendrá un error de definición múltiple cuando los vincula. En este caso, debe comstackr con -fcommon en -fcommon lugar. La -fno-common con -fno-common es útil en objectives para los que proporciona un mejor rendimiento, o si desea verificar que el progtwig funcionará en otros sistemas que siempre traten las declaraciones de variables no inicializadas de esta manera.

Formalmente, tienes razón: esto es un error. Pero la mayoría de las implementaciones de C lo admiten como una extensión (al menos de forma predeterminada). C99 realmente lo menciona en el Anexo J informativo como una extensión común

J.5.11 Múltiples definiciones externas

1 Puede haber más de una definición externa para el identificador de un objeto, con o sin el uso explícito de la palabra clave extern ; si las definiciones no están de acuerdo, o se inicializa más de una, el comportamiento no está definido (6.9.2)