Un forum web "Bien programmer en C" permet de poser des questions sur les articles, le C en général, la programmation etc.
Codage en C : Usage détaillé des séparateurs
Dernière mise à jour : 06/05/2009 23:50:48 | Codage
A l'origine, on a un fichier avec main() (par exemple main.c, comme ça, on voit tout de suite de quoi on parle). main() est le point d'entrée (unique) de ce module. On peut donc ecrire :
/* main.c */ #include/* entry points ======================================================== */ int main (void) { puts ("hello world"); return 0; }
Le programme évoluant, on a maintenant une fonction privée (static) :
/* main.c */ #include/* private functions =================================================== */ static void hello(void) { puts ("hello world"); } /* entry points ======================================================== */ int main (void) { hello(); return 0; }
Nouvelle évolution, on crée un bloc fonctionnel (BF) hello composé pour le moment d'une seule fonction. On retouve donc la structure habituelle avec 3 fichiers :
#ifndef H_HELLO #define H_HELLO /* hello.h */ /* entry points ======================================================== */ void hello(void);
/* hello.c */ #include "hello.h" #include/* entry points ======================================================== */ void hello(void) { puts ("hello world"); }
/* main.c */ #include "hello.h" /* entry points ======================================================== */ int main (void) { hello(); return 0; }
On fait dans le luxe et on décompose la fonction hello() en plusieurs petites fonctions (un peu théorique, mais c'est pour montrer le principe).
/* hello.c */ #include "hello.h" #include/* private functions =================================================== */ static void h(void) { printf ("hello"); } static void w(void) { printf ("world"); } static void spc(void) { putchar (' '); } static void eol(void) { putchar ('\n'); } /* entry points ======================================================== */ void hello(void) { h(); spc(); w(); eol(); }
Le reste (interface, allocation) est inchangé.
Attention, étape ultime et subtile.
Le fichier d'implémentation de hello est devenu tellement gros qu'il nécessite lui-même un découpage. Il va donc falloir distinguer ce qui est accessible à l'utilisateur de hello (les points d'entrées) et les fonctions 'internes', c'est à dire connues de hello mais pas de l'application, d'où cette distinction, qui se traduit aussi par des headers distincts :
/* hellotools.c */ #include "hellotools.h" #include/* internal public functions =========================================== */ void hello_spc(void) { putchar (' '); } void hello_eol(void) { putchar ('\n'); }
#ifndef H_HELLOTOOLS #define H_HELLOTOOLS /* hellotools.h */ /* internal public functions =========================================== */ void hello_spc(void); void hello_eol(void); #endif
/* hello.c */ #include "hellotools.h" #include "hello.h" #include/* private functions =================================================== */ static void h(void) { printf ("hello"); } static void w(void) { printf ("world"); } /* entry points ======================================================== */ void hello(void) { h(); hello_spc(); w(); hello_eol(); }
Cela revient à créér plusieurs niveau de visibilité...
© Emmanuel Delahaye 2004-2009 | emmanuel dot delahaye at gmail dot com | Haut | Codage | Home | Forum | Livre d'or