Когда я пишу следующую программу:
файл 1:
#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);
}
файл 3:
void print_global1();
void print_global2();
int main()
{
print_global1();
print_global2();
return 0;
}
выход:
$ ./a.out
0x804a01c
0x804a01c
Вот мой вопрос:
- Почему компоновщик реализует "int global" и "char global" как одну и ту же глобальную переменную:
- Почему компилятор не жалуется (не самое маленькое предупреждение с
-Wall -Wextra -ansi
...) - Как управляется размер управляемой глобальной переменной (размер int и char различаются)
PS: Второй вопрос связан с архитектурой/компилятором, поэтому давайте возьмем gcc или Visual С++ (для C) с размером int 32 бита
EDIT: ЭТО НЕ ВОПРОС ДЛЯ С++, но для C!
Я использую gcc версии 4.4.1 и на Ubuntu 9.10. Вот вывод консоли компиляции:
$ 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