Prenons une macro pour calculer le maximum de deux valeurs :
#define MAX(a, b) ((a) < (b) ? (a) : (b))
Alors on l'utilise comme ça :
int x = 5;
int y = 10;
int max = MAX(x++, y++);
Ensuite, la macro est étendue à
int max = ((x++) < (y++) ? (x++) : (y++));
Comme vous pouvez le voir, l'opération d'incrémentation sur l'un ou l'autre x
ou y
se produira deux fois Ce n'est pas ce qui se passerait si vous aviez une fonction où chaque argument que vous passez est évalué une seule fois.
Un autre point important est l'utilisation des parenthèses dans la macro. Prenons une autre macro simple :
#define MUL(a, b) a * b
Maintenant, si vous invoquez la macro comme
int sum = MUL(x + 3, y - 2);
alors l'expansion devient
int sum = x + 3 * y - 2;
Ce qui, en raison de la préséance des opérateurs est égal à
int sum = x + (3 * y) - 2;
Souvent, ce n'est pas tout à fait ce à quoi on s'attendait, si on s'y attend. (x + 3) * (y - 2)
.
Ce problème est également "résolu" par l'utilisation de fonctions.