Ваш вопрос проясняет, что вы на самом деле не сделали много серьезных разработок. Обычный случай - ваш код будет слишком большим, чтобы поместиться в один файл. Хорошее правило заключается в том, что вы должны разбивать функциональность на логические единицы (файлы .c), и каждый файл должен содержать не более того, что вы можете легко удерживать в своей голове за один раз.
Данный программный продукт обычно включает выходные данные из множества различных файлов .c. Обычно это делается так, что компилятор создает несколько объектных файлов (в системах Unix ".o" файлы VC генерируют файлы .obj). Назначение «компоновщика» состоит в том, чтобы объединить эти объектные файлы в выходные данные (совместно используемую библиотеку или исполняемый файл).
Как правило, ваши файлы реализации (.c) содержат фактический исполняемый код, в то время как заголовочные файлы (.h) имеют объявления открытых функций в этих файлах реализации. Вы можете легко иметь больше заголовочных файлов, чем файлов реализации, и иногда заголовочные файлы также могут содержать встроенный код.
Обычно файлы реализации довольно часто включают друг друга. Хорошей практикой является обеспечение того, чтобы каждый файл реализации отделял свои проблемы от других файлов.
Я бы порекомендовал вам скачать и посмотреть исходный код ядра Linux. Это довольно масштабно для C-программы, но хорошо организовано в отдельные области функциональности.