include
#include <fichier>et
#include "fichier"demande l'inclusion de
fichier
dans le programme.
#define TAILLE 1024dé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 TAILLELes macro-constantes prédéfinies:
__FILE__
donne le nom de fichier (fichier source),
__LINE__
donne le numéro de la ligne courante dans le fichier,
__DATE__
donne la date de la compilation,
__TIME__
l'heure de la compilation,
__STDC__
vaut 1 si le compilateur conforme à la norme de C.
gcc -D TAILLE=512 -Wall -ansi -o toto toto.ccompile
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 #endifsi 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.
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.cle 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( .... ); #endifet les
printf
vont être compilés seulement si DEBUG
est défini.
Alors la compilation
gcc -D DEBUG -Wall -ansi -o toto toto.csera utilisée pour déboguage par contre
gcc -Wall -ansi -o toto toto.crend 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 DEBUGpour définir des constantes à la compilation.
CPPFLAGS
c'est une variable de
Makefile
où on met des options de préprocesseur.
#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*xla substitution dans
z=a*CARRE(y+1);donnera
z=a*y+1*y+1;ce qui probablement n'est pas ce qu'on veut.
#define IPRINT(x) printf("%s = %s\n", #x, x);alors
IPRINTF(x*y) ;sera remplacé par
printf("%s = %s\n", "x*y", x*y );