Каждый файл C - это отдельная единица перевода .Другими словами, это вся отдельная программа , синтаксически полная и правильная.Таким образом, каждый файл C должен компилироваться независимо от любого другого файла C и должен содержать каждое объявление для каждого идентификатора, который он использует, независимо от того, появляются ли эти объявления также в других файлах C.С точки зрения компилятора, каждый файл C сам по себе является законченной программой (хотя и с неразрешенными ссылками).
Заголовочные файлы - это, как правило, файлы, которые содержат объявления, которые должны появляться вгруппа C файлов.Заголовочные файлы могут быть включены препроцессором - который представляет собой простое текстовое копирование и вставка в точке включения - для удобства, чтобы избежать дублирования объявлений вручную между единицами перевода.
Подводя итог: этонеобязательно включать одни и те же файлы в разные файлы C. Это формально необходимо.
(После этого вы связываете объектные файлы, которые являются просто меньшими программами, в большую конечную программу.Более крупная программа представляет собой суммирование меньших подпрограмм, между которыми разрешены все ссылки. Вообще говоря, фаза компоновки ничего не знает о языковой структуре исходных файлов, которые сгенерировали результирующий объектный файл.)