Exood4 Studio - Video Game Development, Toulouse (France)
Exood4 Studios Exood4 Tutorials

   
L a n g a g e   C

L e    p r p r o c e s s e u r






 Le rle du prprocesseur est de prparer le fichier source en C pour le compilateur. Suivant l'architecture des machines, il peut tre soit un programme indpendant, soit faire partie intgrante du compilateur, auquel cas la transformation du fichier source et la compilation se font en mme temps.

 En fonction des directives qu'il rencontre au cours de la lecture du programme, le prprocesseur traite la source et gnre un texte intermdiaire. Les directives sont limines aprs leur traitement. Cette source intermdiaire, qui est toujours du C, est ensuite compile.

 Une directive est une ligne commenant par #. Elle se termine en fin de ligne, sauf si le dernier caractre est \ . Dans ce cas, elle continue sur la ligne suivante. Sa syntaxe est indpendante du reste du langage. En particulier, le prprocesseur ne reconnat pas les mots cls. Une directive peut apparatre n'importe o dans le programme source.


Dfinir les symboles


 La directive #define permet de dfinir un symbole. Le prprocesseur substitue partir de la ligne de sa dfinition et jusqu' la fin du fichier source, toutes les occurrences du symbole reconnues l'intrieur du programme par une chane de remplacement ( l'exception des occurrences contenues dans un commentaire ou dans une constante chane de caractres).


Exemple : #define symbole chaine_de_remplacement

 Le remplacement n'est qu'une simple substitution de chanes de caractres et ne fait pas intervenir les rgles syntaxiques du langage C. La chane de remplacement peut tre vide. Un symbole est une entit virtuelle puisqu'il n'est pas vu par le compilateur. La chane de remplacement est elle mme explore pour y substituer d'ventuels symboles qui y seraient contenus.

#define BEGIN   {
#define END }
#define BJR_BSR BEGIN printf("bonjour\n"); \
 printf("bonsoir\n"); END

Ce qui permet d'crire :

void main()
BEGIN
 ...
 if (...) BJR_BSR;
 ...
END

 De mme pour dfinir des constantes :

#define PI 3.1415926535898
#define _2PI   2*PI

 Dans ce cas il est prfrable d'utiliser le spcificateur de type const qui interdit la modification de la valeur de l'objet ainsi dclar.

const double pi = 3.1415926535898;


Supprimer des symboles


 La directive #undef peut tre utilise pour supprimer la dfinition d'un symbole. Une fois supprim, le symbole peut tre redfini.

#define PI 3.1415926535898
#undef PI
#define PI (355/113)


Inclure des fichiers


 La directive #include permet d'insrer un fichier. Elle est remplace lors de la compilation par le contenu du fichier qui doit tre un texte source en C.

#include <nom_de_fichier>

/* indique qu'il faut chercher le fichier dans les rpertoires standards de travail du compilateur */


#include "nom_de_fichier"

/* indique qu'il faut d'abord chercher le fichier dans le rpertoire contenant le fichier source qui est compil, et seulement ensuite dans les rpertoires standards. La premire forme est utilise pour se rfrer aux librairies standards (stdio.h, stdlib.h ...) */


Les fichiers en-ttes


 Chaque fonction doit tre dclare avant d'tre utilise. Ceci s'applique tout particulirement aux fonctions de la librairie standard. Or dclarer chacune de ces fonctions avant de l'utiliser serait relativement pnible et source d'erreur. C'est pourquoi, pour viter ce travail aux programmeurs, il existe des fichiers sources, appels fichiers en-ttes (headers), qui contiennent ces dclarations. Chaque fichier en-tte correspond une fonctionnalit :

 stdlib.h : traitements courants

 stdio.h : entres/sorties

 string.h : manipulation de chanes de caractres

 ctype.h : classification et conversion de caractres

 math.h : traitements mathmatiques


 Les fichiers en-ttes standard contiennent aussi des dfinitions de symboles, de types, ... :

 time.h : dfinition des types et des fonctions de manipulation du temps

 limits.h : dfinition lies l'architecture de la machine (tailles des types, valeurs extrmes ...)


 Un programme de taille importante se dcompose en gnral en plusieurs fichiers sources. Chacun de ces fichiers contient alors ses propres directives #include.

 Un problme peut se poser si nous avons simultanment plusieurs fichiers sources incluant le mme fichier d'en-tte et le fichier en-tte en question qui contient une dfinition (par exemple : int a;). Le programme comporte dans ce cas plusieurs dfinitions d'une mme variable globale (ici la variable entire a). Cette ambigut ne sera pas dcele la compilation, puisque chaque fichier est compil indpendamment des autres, mais cela provoquera des erreurs l'dition des liens.

 Afin d'viter ce genre de problme, il est conseill de ne pas crire dans un fichier en-tte des instructions gnrant du code. Autrement dit, on convient qu'un fichier en-tte peut contenir :
  • des dclarations : extern int a; int f(int,float);
  • des directives pour le prprocesseur : #define, #include
  • des dfinitions de types : struct complexe { float re, im; }; enum bool { faux, vrai };
  • des commentaires
 Il est dconseill d'utiliser :
  • des dfinitions de variables : int a;
  • des dfinitions de fonctions : int plus (int a, int b) { return a+b; }


  Retour en haut de page Page suivante