Title: Le Prprocesseur
1Le Préprocesseur
2Sujets abordés
- Préprocesseur
- Quest ce?
- Quest ce quune directive?
- Les macros
- Les définir, les redéfinir, les dé-définir
- Les macros à arguments
- Directives ifdef et ifndef
- Autres diectives
3Le préprocesseur
- Simple substitution de texte
- Augmente la lisibilité du code source
- Augmente la vitesse dexécution du programme
- Favorise un débuggage heureux
4Directives
- Une directive au préprocesseur commence toujours
par - include, define, ifdef
- Les directives sont effectives sur tout le
fichier.
5Macros
- Définies par la directive define
- Deux formes
- Simple remplacement dune chaîne de caractère.
- Remplacement de la chaîne et substitution
dargument. - Une macro peut être définie sur plusieurs lignes
(retour chariot)
6Macro simple
- define IDENTIFIANT chaîne
- chaîne est une séquence de caractères
- Toute occurrence de IDENTIFIANT dans le texte
sera remplacé par chaîne - Pas de remplacement dans entre
7Macro simple (2)
- Code original
- define TAXE 0.7
- ...
- netbrut-(brutTAXE)
- printf(TAXE\n)
- Code intermédiare
- ...
- netbrut-(brut0.7)
- printf(TAXE\n)
8Macro avec arguments
- define IDENTIFIANT(x,y) chaîne
- Pas despace entre IDENTIFIANT et la parenthèse
- x et y sont des arguments formels pour la macro
- Code original
- define READINT(I) scanf(d,I)
-
- READINT(hours)
- Code intermédiaire
-
- scanf(d,hours)
9Macros prédéfinies
- Dans stdio.h
- define getchar() getc(stdin)
- define putchar(c) putc(c,stdout)
10Macro à arguments multiples
- Code original
- define MIN(X,Y) ( (X)gt(Y) ? (X) (Y) )
- .
- MIN(a,b)
- Code intermédiaire
- .
- ( (a) gt (b) ? (a) (b) )
11Problèmes courants
- Code original
- define SQR(X) XX
-
- SQR(a1)
- Code intermédiaire
-
- a1a1 //ce qui est égal à a(1a)1
- Solution parenthèser
- define SQR(X) (X)(X)
12Les macros ne sont pas des fonctions
- Code original
- define SWAP(X?Y) int temp tempX XY
Ytemp - void main(int)
- int a3, b4
- SWAP(a,b)
-
- Code intermédiaire
- void main(void)
- int a3,b4
- int temp tempa ab btemp
13Macro prédéfinies
- __FILE__ nom du fichier source courant
- __LINE__ numéro de ligne courant
- __DATE__ date de compilation du fichier courant
- __TIME__ heure de compilation du fichier
courant - printf(s a été compilé le s\n,__FILE__,__DAT
E__)
14Opérateurs de Macro
- permet de convertir largument en chaîne de
caractère - define MSG(F) printf(F)
-
- MSG(test mess) //devient printf(test mess)
- permet de concaténer
- define ERR(X,Y) printf(X Y)
-
- ERR(err ,une erreur) //devient
printf(err une erreur)
15Dédéfinir et redéfinir des macros
- Il nest pas permis de redéfinir des macros, sauf
si elles ont été dédéfinies par undef au
préalable. - undef est ignoré si lidentifiant na pas été
défini - undef peut dédéfinir des macro prédéfinies!!!!
16Inclure des fichiers
- On inclue des fichiers textes par include
- Le texte du fichier est alors recopié à cet
endroit. - include ?stdio.h? cherche dans le chemin
standard le fichier stdio.h - include monFichier.h cherche le fichier
monFichier.h dans le répertoire courant.
17Conséquence des inclusions
include prog1.h Int main(void)
include ?stdio.h? typedef int p_int
prog1.h
prog1.c
Prog1.c pourra alors utiliser les fonctions de la
bibliothèque stdio.h
18Compilation conditionnelle
- Sélectionne des parties du code à omettre lors de
la compilation si une condition est remplie. - Ces parties peuvent contenir des déclarations
et/ou des actions - Qui sont spécifique à un matériel
- Utiles au débuggage uniquement.
19Compilation conditionnelle (2)
- Utiliser les directives
- ifdef, elif, else, endif
- Les conditions de test
- Sont des constantes entières
- Evaluées comme Vrai/Faux
- Peuvent contenir des opérateurs si ils sont
évalués sur des constantes entières
20Compilation conditionnelle (3)
- include ?stdio.h?
- define DEBUG 2
- int main(void)
- if DEBUG 2
- printf(DEBUG est à 2\n)
- else
- printf(DEBUG nest pas à 2\n)
- endif
- return 0
21Compilation conditionnelle (4)
- Si on effectue gcc E fichier.c, on obtient le
résultat de laction du préprocesseur - int main(void)
- printf(DEBUG est à 2\n)
- return 0
-
22Compilation conditionnelle (5)
- Aide au débuggage dun programme
- On peut donner nimporte quel nom aux
identifiants - Chaque directive if doit recevoir une directive
endif
23Définitions
- Concerne les directives ifdef et ifndef
- Utilisées pour déterminer si un symbole est connu
du préprocesseur. - ifdef identifieur vérifie si identifieur a été
défini - ifndef identifieur vérifie si il na pas été
défini.
24Combinons définitions et compilation
conditionnelle
- Permet déviter de définir plusieurs fois le même
identifiant ou symbole et de résoudre des
conflits quand - Insertion multiple dun même fichier den-tête
- Déclaration multiple dun identifiant
- Redéfinition dun identifiant
25Technique
- Pour un fichier en-tête classic.h
- ifndef CLASSIC.H
- define CLASSIC.H
- .
- endif
26Autre directives
- error message
- Emet une erreur de compilation avec pour message
message si activée. - line numero_de_ligne nom_de_fichier
- __LINE__ est réinitialisé à numero_de_ligne
- __FILE__ est réinitialisé à nom_de_fichier