В C, почему бы мне не получить ошибку, когда я объявляю глобальную переменную в другом типе данных в другом файле?
Я пробовал следующий код:
file1.c:
int x;
file2.c:
extern char x;
main()
{
x=10;
....
....
}
и скомпилирован как
$gcc File1.c File2.c
и я не получил никаких ошибок, но я ожидал их.
Ответ 1
В File.c вы обещаете компилятору, что x имеет тип char. Поскольку каждая единица перевода компилируется отдельно, компилятор не имеет возможности проверить это и принимает ваше слово. И компоновщик не выполняет проверку типов. Вы получаете недействительную программу, которая строит без ошибок.
Вот почему вы должны использовать файлы заголовков. Если File1.c и File2.c оба получили объявление extern из x из того же заголовка, тогда вы получите сообщение об ошибке при компиляции File1.c (поскольку определение не соответствует объявлению). [Кончик шляпы @SteveJessop]