Ответ 1
В File.c
вы обещаете компилятору, что x
имеет тип char
. Поскольку каждая единица перевода компилируется отдельно, компилятор не имеет возможности проверить это и принимает ваше слово. И компоновщик не выполняет проверку типов. Вы получаете недействительную программу, которая строит без ошибок.
Вот почему вы должны использовать файлы заголовков. Если File1.c
и File2.c
оба получили объявление extern
из x
из того же заголовка, тогда вы получите сообщение об ошибке при компиляции File1.c
(поскольку определение не соответствует объявлению). [Кончик шляпы @SteveJessop]