#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.