Pacte écologique

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é...


Valid XHTML 1.0! Valid CSS! Get Firefox!  Use OpenOffice.org Club d'entraide des développeurs francophones Code::Blocks