Cuando escribo el siguiente programa:aplicación Variable global
archivo 1: archivo
#include <stdio.h>
int global;
void print_global1() {
printf("%p\n", &global);
}
2:
#include <stdio.h>
char global;
void print_global2() {
printf("%p\n", &global);
}
archivo 3:
void print_global1();
void print_global2();
int main()
{
print_global1();
print_global2();
return 0;
}
de salida:
$ ./a.out
0x804a01c
0x804a01c
Aquí es mi pregunta:
- Por qué están implementando el enlazador "int global" y "char global" como la misma variable global:
- ¿Cómo es que el compilador no se queja (no el más pequeño de advertencia con
-Wall -Wextra -ansi
...) - ¿Cómo están el tamaño de la variable global gestionado (el tamaño de int y carbón son diferentes)
PS: La segunda pregunta es arquitectura/compilador relacionado, así que tomemos el gcc o Visual C++ (para C) con el tamaño int como 32 bits
EDITAR: ¡ESTA NO ES UNA PREGUNTA PARA C++ PERO para C!
utilizo versión de gcc 4.4.1 y en Ubuntu 9.10, aquí está la salida de la consola compilación:
$ 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
No estoy haciendo C++ pero el programa C (es por eso que no puse la bandera C++ en mi respuesta)! Parece que la especificación estándar C permite este comportamiento (pero no estoy seguro). Todavía puedo usar el enlazador C++ para verificar si hay definición múltiple, pero no estoy seguro si es realmente seguro ... – Phong
@Phong: tienes razón ... la C std lo permite. He actualizado mi respuesta. – codaddict
@codaddict: +1, ¡Gracias por la actualización rápida! Ahora entiendo mejor cómo lo maneja el compilador. – Phong