Pièges des priorités d'opérateurs

Supposons que l'on écrive :
#define CARRE(a) a * a
une occurrence de CARRE(a+b) aura comme expansion a+b * a+b ce qui est différent du (a+b) * (a+b) qui était désiré. De la même manière !CARRE(x) aura comme expansion !x * x ce qui est différent du !(x * x) qui était désiré.

On recommande donc de toujours respecter deux règles dans la définition d'une macro devant être utilisée dans des expressions :

  1. parenthéser les occurrences des paramètres formels ;
  2. parenthéser le corps complet de la macro.
Une définition de CARRE respectant ces règles est :
#define CARRE(a) ((a) * (a))



Matthieu Moy 2017-02-08