В заголовочных файлах указывается интерфейс (объявления функций, определения макросов, определения типов и т. Д.), А в файлах .c указывается реализация (определения функций и объектов).
Вы почти никогда не включаете файл .c в другой файл .c, главным образом потому, что он быстро становится кошмаром обслуживания, если два файла .c используют одни и те же символы для разных целей или если вы включили цепочки включений (a.c
включает b.c
, который включает c.c
и т. Д.), И вы получите модуль перевода, который слишком велик для обработки компилятором.Это также означает, что если вы изменяете включенный файл .c, вы должны перекомпилировать все, что включает его, независимо от того, изменился этот код или нет, что делает сборку более длительной, чем должна.
EDIT
Третья причина заключается в том, что вы можете захотеть скрыть некоторые элементы данных или функции из более крупной программы (по сути, сделать эти элементы «частными» для определенного исходного файла).Если вы включите этот исходный файл в другой исходный файл, вы потеряете эту способность.Опять же, это реальная проблема, если вы используете одну и ту же переменную или имя функции для разных целей в разных файлах.
END EDIT
Отдельная компиляция и компоновка - это хорошо, особенно для больших проектов.
Обычно компоновщики ничего не знают об исходных файлах- в типичной цепочке инструментов программист указывает, где все находится через make-файл или что-то подобное.