Oui mais ne serais ce que pour le temps de compilation, l´emploi de headers est désatreux vu qu´aucun fichier objet n´est génré pour ce type de fichier : la moindre modification d´une fonction d´un header entrainera la nécessité de recompiler l´ensemble des modules .c employant ces fonctions, tandis que si tu employais des fichiers source, une modification interne d´une des fonctions du moteur ne nécessiterait que la recompilation du seul fichier source incriminé. Alors c´est vrai qu´au début d´un projet, les temps de compilation paraissent ridicules, mais ca augmente très vite. Et il y a d´autres raisons (accessibilité de certaines fonctions du moteur par l´ensemble du programme etc...).
Que ce passe-il en outre si tu souhaite quelques années plus tard, autoriser la création de mods sans pour autant libérer le source du renderer ? (c´est à titre d´exemple). Impossible, ou alors fractionner le programme, utiliser des dll etc... tandis qu´avec des .h/.c : il suffit de ne fournir que les modules objet (regroupés en libs par exemple) et les header : les headers, parce qu´il sont clairs et consics, permettent de voir tout de suite le rôle des fonctions etc... tout en masquant l´implémentation contenue dans les fichiers .obj.
Ce n´est pas un hasard si tous les projets professionnels et même amateurs emploient cette règle du couple .h/.c
"on pourrait très bien appeler le même header pour plusieurs fichier .c et on ne va quand même pas pour autant appeler plusieurs fois ce header!"
C´est quand même l´objectif de la chose : lier les fichiers source entre eux.
D´un point de vue conception c´est vraiment pas conseillé : le projet débute, il est donc facile d´y remédier.