Quando scrivo il seguente programma:implementazione variabile globale
file di 1:
#include <stdio.h>
int global;
void print_global1() {
printf("%p\n", &global);
}
file di 2:
#include <stdio.h>
char global;
void print_global2() {
printf("%p\n", &global);
}
file di 3:
void print_global1();
void print_global2();
int main()
{
print_global1();
print_global2();
return 0;
}
uscita:
$ ./a.out
0x804a01c
0x804a01c
Ecco la mia domanda:
- Perché i linker attuando "int globale" e "char globale" come lo stesso variabile globale:
- Come mai il compilatore non si lamenta (non il più piccolo avviso con
-Wall -Wextra -ansi
...) - Come sono le dimensioni della variabile globale gestito (la dimensione di int e char sono diversi)
PS: La seconda domanda è relativa all'architettura/compilatore, quindi prendiamo il gcc o Visual C++ (per C) con la dimensione int come 32 bit
MODIFICA: QUESTA NON E 'UNA DOMANDA PER C++ MA C!
Io uso gcc version 4.4.1 e su Ubuntu 9.10, ecco l'output della console di compilazione:
$ ls
global_data1.c global_data2.c global_data.c
$ gcc -Wall -Wextra -ansi global_data*.c
$ ./a.out
0x804a01c
0x804a01c
or
$ gcc -Wall -Wextra -ansi -c global_data*.c
$ gcc -Wall -Wextra -ansi global_data*.o
$ ./a.out
0x804a01c
0x804a01c
Non sto facendo C++ ma programma C (questo è il motivo per cui non ho inserito il flag C++ nella mia risposta)! Sembra che la specifica C standard permetta questo comportamento (ma non ne sono proprio sicuro). Posso ancora usare il linker C++ per verificare se esiste una definizione multipla ma non sono sicuro se sia davvero sicuro ... – Phong
@Phong: hai ragione ... il C std lo consente. Ho aggiornato la mia risposta. – codaddict
@codaddict: +1, Grazie per l'aggiornamento rapido! Ora capisco meglio come è gestito dal compilatore. – Phong