В 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]