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