Programmer en langage C
210
© Éditions Eyrolles
Vous constatez que, si le premier appel de macro conduit à un résultat correct, le deuxième ne
fournit pas, comme on aurait pu l’escompter, le double de l’expression figurant en paramètre.
Quant au troisième, il fait apparaître ce que l’on nomme souvent un « effet de bord ». En effet,
la notation :
DOUBLE(x++)
conduit à incrémenter deux fois la variable x. De plus, elle ne fournit pas vraiment son double.
Par exemple, si x contient la valeur 5, l’exécution du programme ainsi généré conduira à
calculer 5+6.
Le premier problème, lié aux priorités relatives des opérateurs, peut être facilement résolu en
introduisant des parenthèses dans la définition de la macro. Ainsi, avec :
#define DOUBLE(x) ((x)+(x))
...
DOUBLE(a)/b
DOUBLE(x+2*y)
DOUBLE(x++)
Le texte généré par le préprocesseur sera :
((a)+(a))/b
((x+2*y)+(x+2*y))
((x++)+(x++))
Les choses sont nettement plus satisfaisantes pour les deux premiers appels de la macro DOUBLE.
Par contre, bien entendu, l’effet de bord introduit par le troisième n’a pas pour autant disparu.
Par ailleurs, il faut savoir que les substitutions de paramètres ne se font pas à l’intérieur des
chaînes de caractères. Ainsi, avec ces instructions :
#define AFFICHE(y) printf("valeur de y %d",y)
...
AFFICHE(a) ;
AFFICHE(c+5) ;
le texte généré par le préprocesseur sera :
printf("valeur de y %d",a) ;
printf("valeur de y %d",c+5) ;
Dans la définition d’une macro, il est impératif de ne pas prévoir d’espace dans la partie spécifiant le nom de la macro et les différents paramètres. En effet, là encore, le premier espace sert
à délimiter la macro à définir. Par exemple, avec :
#define somme (a,b) a+b
...
z = somme(x+5) ;
Delannoy Livre.book Page 210 Mercredi, 6. mai 2009 4:26 16
Précédent

- 223/281

Suivant