Pre-processeur

Directives include

Les directives
#include <fichier>
et
#include "fichier"
demande l'inclusion de fichier dans le programme.

Macro-constantes

Une directive
#define TAILLE 1024
définit une macro-constante TAILLE. A partir de cette définition toute occurrence de nom TAILLE dans le programme sera remplacée par 1024. On peut annuler la définition par la directive
#undef TAILLE
Les macro-constantes prédéfinies: Les macro-constantes peuvent être définies à la compilation:
gcc -D TAILLE=512 -Wall -ansi -o toto toto.c
compile toto.c et définie une macro-constante TAILLE de valeur 512. Dans ce cas toto.c peut contenir par exemple les directives suivantes:
#ifndef TAILLE
#define TAILLE 1024
#endif
#ifndef CONSTANTE c'est un test de l'existence d'une macro-constante. Le test vaut 1 (vrai) si la macro-constante n'est pas définie. Il existe un test symétrique #ifdef CONSTANTE qui vaut 1 (vrai) si la macro-constante est définie. Alors dans
#ifndef TAILLE
#define TAILLE 1024
#endif
si la macro-constante TAILLE n'est pas définie on la définie avec la valeur 1024. Par contre si TAILLE est déjà définie alors on ne fait rien.
Supposons maintenant que le fichier toto.c contient
#ifndef TAILLE
#define TAILLE 1024
#endif

int tab[TAILLE];

Si on compile notre programme avec
gcc -D TAILLE=512 -Wall -ansi -o toto toto.c
le tableau tab aura 512 éléments, par contre si on compile avec
gcc -Wall -ansi -o toto toto.c
tab aura 1024 éléments.

Supposons maintenant que pour déboguer notre programme nous avons mis dans plusieurs endroit de notre programme les printf qui affichent les valeurs de variables. Mais nous voulons que ces printf soient actifs seulement pour déboguage. Dans ce cas nous pouvons mettre dans notre programme tous ces printf sous forme

#ifdef DEBUG
        printf(   ....    );
#endif 
et les printf vont être compilés seulement si DEBUG est défini. Alors la compilation
gcc -D DEBUG -Wall -ansi -o toto toto.c
sera utilisée pour déboguage par contre
gcc -Wall -ansi -o toto toto.c
rend tous ces printf inactifs.

Si on utilise Makefile ce qui est préférable alors on peut y mettre la ligne

CPPFLAGS= -D TAILLE=512 -D DEBUG
pour définir des constantes à la compilation. CPPFLAGS c'est une variable de Makefile où on met des options de préprocesseur.

Macro-fonctions

#define CARRE(x)  ((x)*(x))
définie une macro-fonction CARRE. Si dans le code de programme on rencontre
z=a*CARRE(y+1);
le preprocesseur effectuera une substitution
z=a*((y+1)*(y+1));
Notons que si on définie
#define CARRE(x)  x*x
la substitution dans
z=a*CARRE(y+1);
donnera
z=a*y+1*y+1;
ce qui probablement n'est pas ce qu'on veut. Un dièse devant un variable de macro-fonction transforma la valeur de cette variable en chaîne de caractères. Par exemple si
#define IPRINT(x) printf("%s = %s\n", #x, x);
alors
IPRINTF(x*y) ;
sera remplacé par
printf("%s = %s\n", "x*y", x*y );