He leído las preguntas existentes sobre el enlace externo/interno aquí en SO. Mi pregunta es diferente: ¿qué sucede si tengo múltiples definiciones de la misma variable con enlaces externos en diferentes unidades de traducción bajo C
y C++
?Diferencia en el enlace entre C y C++?
Por ejemplo:
/*file1.c*/
typedef struct foo {
int a;
int b;
int c;
} foo;
foo xyz;
/*file2.c*/
typedef struct abc {
double x;
} foo;
foo xyz;
Usando Dev-C++ y como un programa C, el programa anterior compila y enlaces perfectamente; mientras que da un error de redefinición múltiple si el mismo se compila como un programa de C++. ¿Por qué debería funcionar en C y cuál es la diferencia con C++? ¿Es este comportamiento indefinido y dependiente del compilador? ¿Qué tan "malo" es este código y qué debo hacer si quiero refactorizarlo (me he encontrado con un montón de código antiguo escrito de esta manera)?
El comportamiento de C puede ser cierto en su implementación pero no está garantizado por el idioma. –
Un nombre de variable es solo una etiqueta para una dirección de memoria. Si proporciona dos definiciones de cómo interpretar esa etiqueta, eso no hace que la etiqueta se refiera mágicamente a dos objetos diferentes. ¿Alguna vez has visto un enlazador que se comporte de manera diferente a eso? –
No niego que este es el comportamiento del enlazador habitual, este comportamiento es utilizado por otros lenguajes y muchas implementaciones C. La implicación de su respuesta, sin embargo, fue que es un comportamiento bien definido. Permitir más de una definición externa en un programa es una extensión común, según el Anexo J estándar de C, pero incluso con esta extensión si las definiciones no concuerdan, da como resultado un comportamiento indefinido. –