Souvent, je crée un fichier d'en-tête pour 'main' même si je ne m'attends pas à ce que d'autres codes y accèdent, car souvent (1) une version de débogage nécessitera quelque chose en dehors du module principal pour accéder à quelque chose dedans, ou (2) le module principal finira par devoir être divisé en raison des limitations de compilateur (système embarqué). Le fait que chaque fichier .c inclue son propre fichier .h est suffisamment puissant pour que je crée souvent des fichiers .h presque vides, même pour les fichiers .c qui définissent des éléments qui ne sont pas référencés dans le code (comme les tables de saut d'interruption) , etc.).
Les conventions de dénomination deviennent un peu plus délicates lorsqu'un fichier comprend plusieurs fichiers générés par le programme ou comprend des fichiers qui doivent être compilés plusieurs fois (par ex.un de mes projets a deux moteurs, dont le code est identique sauf qu'ils utilisent des ports d'E/S différents et des variables différentes; mon fichier motor.c contient:
#define LOCK L0
#include "motor.i"
#undef LOCK
#define LOCK L1
#include "motor.i"
#under LOCK
Notez que sur ce point particulier compilateur intégré, l'opérateur -> est très inefficace, donc une déclaration comme:
L0.speed++;
compilera à une des instructions, alors qu'un déclaration comme:
L0->speed++;
se traduira en cinq instructions si la « vitesse » est le premier élément de la structure, ou sept si elle occupe une autre position. Il est donc beaucoup plus rapide et plus économe en espace de dupliquer du code avec des adresses résolvables constantes plutôt que d'avoir une routine qui gère les deux moteurs.
S'il y a un fichier supplémentaire associé à un fichier .c, et qu'il contient du code réel, je le nommerai ".i". Je ne sais pas quoi faire s'il y en a plus d'un.
Donc, je suppose que le corollaire de cette réponse est que le modèle de façade mène souvent à une relation non-un-à-un .c à .h? – Tommy