Нет технической разницы.Компилятор с радостью позволит вам включить файл .c
или скомпилировать файл .h
напрямую, если хотите.
Однако существует огромная культурная разница:
Объявления (прототипы) помещаются в .h
файлы.Файл .h
представляет собой интерфейс для всего, что реализовано в соответствующем файле .c
.
Определения входят в .c
файлы.Они реализуют интерфейс, указанный в файле .h
.
Разница в том, что файл .h
может (и обычно будет) иметь значение #include
dв несколько блоков компиляции (.c
файлов).Если вы определите функцию в файле .h
, она окажется в нескольких файлах .o
, и компоновщик будет жаловаться на несколько определенный символ.Вот почему определения не должны идти в .h
файлах.(Встроенные функции являются исключением.)
Если функция определена в файле .c
, и вы хотите использовать ее из других файлов .c
, объявление этой функции должно быть доступно в каждомиз этих других .c
файлов.Вот почему вы помещаете объявление в .h
и #include
в каждом из них.Вы также можете повторить объявление в каждом файле .c
, но это приводит к большому дублированию кода и непоправимому беспорядку.
Если функция определена в файле .c
, но вы не't хотите использовать его из других .c
файлов, нет необходимости объявлять его в заголовке.По сути, это деталь реализации этого .c
файла.В этом случае сделайте также функцию static
, чтобы она не конфликтовала с функциями с одинаковыми именами в других файлах.