Prima di tutto, per favore aiutami a trovare un titolo migliore che descriva la situazione in modo più accurato. Ho creato la seguente versione semplificata di un problema in cui mi sono imbattuto durante il debug di codice (incorporato) reale.Variabili globali non inizializzate di diverso tipo ma con lo stesso nome - strano comportamento del collegamento
Si consideri il seguente codice di file di t1.c
:
#include <stdio.h>
int A;
void f() { printf("%d\n", A); }
extern void g();
void main(void)
{
g(); A=1; g();
A++;
f();
}
e il codice di t2.c
:
#include <stdio.h>
double A;
void g()
{
A += 1.0;
printf("%f\n", A);
}
Ora compilare ed eseguire il codice come questo:
gcc -Wall t1.c t2.c -o t && ./t
dà
1.000000
2.000000
1
Nota che entrambi i file contengono una variabile globale chiamata A
che ha un tipo diverso. Mi aspettavo un errore di collegamento perché il simbolo A esiste più volte.
Io in realtà ottenere un link di avvertimento (modifiche di dimensione oggetto in diversi .o), quando ho inizializzare una delle due variabili, un errore (più definizioni) quando ho inizializzo entrambi.
Ho provato questo con gcc 4.7 e 4.4.
È questo comportamento previsto? Se è così, c'è qualcosa che posso fare per istruire la toolchain (basata su gcc) per avvisare su di esso?
È un bug?
Grazie per la risposta: non ero a conoscenza del fatto che i globali non inizializzati entrano nel cosiddetto * comune * blocco. –