Les include


Comme je vous l'ai expliqué dans les tout premiers chapitres du cours, on trouve dans les codes source des lignes un peu particulières appelées directives de préprocesseur.


Ces directives de préprocesseur ont la caractéristique suivante : elles commencent toujours par le symbole #. Elles sont donc faciles à reconnaître.

La première (et seule) directive que nous ayons vue pour l'instant est #include.


Cette directive permet d'inclure le contenu d'un fichier dans un autre, je vous l'ai dit plus tôt.


On s'en sert en particulier pour inclure des fichiers .h comme les fichiers .h des bibliothèques (stdlib.h, stdio.h, string.h, math.h…) et vos propres fichiers .h.

Pour inclure un fichier .h se trouvant dans le dossier où est installé votre IDE, vous devez utiliser les chevrons < > :

#include <stdlib.h>



Pour inclure un fichier .h se trouvant dans le dossier de votre projet, vous devez en revanche utiliser les guillemets :

#include "monfichier.h"



Concrètement, le préprocesseur est démarré avant la compilation. Il parcourt tous vos fichiers à la recherche de directives de préprocesseur, ces fameuses lignes qui commencent par un #.

Lorsqu'il rencontre la directive #include, il insère littéralement le contenu du fichier indiqué à l'endroit du #include.

Supposons que j'aie un fichier.c contenant le code de mes fonctions et un fichier.h contenant les prototypes des fonctions de fichier.c. On pourrait résumer la situation dans le schéma de la fig. suivante.



Tout le contenu de fichier.h est mis à l'intérieur de fichier.c, à l'endroit où il y a la directive #include fichier.h.

Imaginons qu'on ait dans le fichier.c :

#include "fichier.h"


int maFonction(int truc, double bidule)

{

    /* Code de la fonction */

}


void autreFonction(int valeur)

{

    /* Code de la fonction */

}



Et dans le fichier.h :

int maFonction(int truc, double bidule);

void autreFonction(int valeur);



Lorsque le préprocesseur passe par là, juste avant la compilation de fichier.c, il insère fichier.h dans fichier.c. Au final, le code source de fichier.c juste avant la compilation ressemble à ça :

int maFonction(int truc, double bidule);

void autreFonction(int valeur);


int maFonction(int truc, double bidule)

{

    /* Code de la fonction */

}


void autreFonction(int valeur)

{

    /* Code de la fonction */

}



Le contenu du .h est venu se mettre à l'emplacement de la ligne #include.

Ce n'est pas bien compliqué à comprendre, je pense d'ailleurs que bon nombre d'entre vous devaient se douter que ça fonctionnait comme ça.

Avec ces explications supplémentaires, j'espère avoir mis tout le monde d'accord. Le #include ne fait rien d'autre qu'insérer un fichier dans un autre, c'est important de bien le comprendre.

Si on a décidé de mettre les prototypes dans les .h, au lieu de tout mettre dans les .c, c'est essentiellement par principe. On pourrait a priori mettre les prototypes en haut des .c (d'ailleurs, dans certains très petits programmes on le fait parfois), mais pour des questions d'organisation il est vivement conseillé de placer ses prototypes dans des .h. Lorsque votre programme grossira et que plusieurs fichiers .c feront appel à un même .h, vous serez heureux de ne pas avoir à copier-coller les prototypes des mêmes fonctions plusieurs fois !

Créé avec HelpNDoc Personal Edition: Créer des fichiers d'aide Qt Help multi-plateformes