Macros générant des instructions

Tous les exemples donnés jusqu'ici sont des exemples de macros générant des expressions. Les macros peuvent aussi générer des instructions et là aussi il y a des pièges à éviter. Supposons qu'ayant à écrire un grand nombre de fois un appel de fonction avec test d'erreur, on définisse la macro suivante :
#define F(x) if (!f(x)) { printf("erreur\n"); exit(1); }
La macro pourra s'appeler comme une fonction (avec un ; à la fin) dans un contexte de liste d'instructions :
{
...
F(i);
...
}
Par contre, dans un contexte d'instruction (et non de liste d'instructions), il ne faudra pas mettre de ; à la fin :
do  F(a)  while ( ... );
alors qu'il le faudrait si il s'agissait d'une fonction :
do  f(a);  while ( ... );
Mais le pire reste à venir : voyons ce qui se passe si on utilise la macro F dans un if avec else :
if ( ... )
   F(i)
else
   ...
Il suffit d'imaginer l'expansion de la macro :
if ( ... )
   if (!f(x)) { printf("erreur\n"); exit(1); }
else
   ...
pour comprendre le problème : le else va être raccroché au if de la macro, ce qui n'est pas ce qu'a voulu le programmeur.



Sous-sections

Matthieu Moy 2017-02-08