Developpez.com - C
X

Choisissez d'abord la catégorieensuite la rubrique :

next up previous contents index
Next: Erreurs avec l'instruction if Up: Le bêtisier Previous: Erreur avec les opérateurs

Sous-sections

Erreurs avec les macros

Le mécanisme des macros est réalisé par le préprocesseur qui réalise un traitement en amont du compilateur proprement dit. Le traitement des macros est un pur traitement textuel, sans aucun contexte ; c'est un nid à erreurs.

Un #define n'est pas une déclaration



Ce que le programmeur a écrit




Ce qu'il aurait du écrire




#define MAX 10;





#define MAX 10



 

Cette erreur peut provoquer ou non une erreur de compilation à l'utilisation de la macro :

-
L'utilisation x = MAX; aura pour expansion x = 10;;, ce qui est licite : il y a une instruction nulle derrière x = 10;.
-
L'utilisation int t[MAX]; aura pour expansion int t[10;]; ce qui génèrera un message d'erreur.

Un #define n'est pas une initialisation



Ce que le programmeur a écrit




Ce qu'il aurait du écrire




#define MAX = 10





#define MAX 10



 

Cette erreur sera généralement détectée à la compilation, malheureusement le message d'erreur sera émis sur l'utilisation de la macro, et non pas là où réside l'erreur, à savoir la définition de la macro.

Erreur sur macro avec paramètres

La distinction entre macro avec paramètres et macro sans paramètre se fait sur la présence d'une parenthèse ouvrante juste après le nom de la macro, sans aucun blanc entre les deux. Ceci peut amener des résultats surprenant ; comparer les deux exemples suivants :
Définition de la macro paramètres corps de la macro
#define add(a,b) (a + b) a et b (a + b)
#define add (a,b) (a + b) aucun (a,b) (a + b)

   

Erreur avec les effets de bord

Le corps d'une macro peut comporter plusieurs occurrences d'un paramètre. Si à l'utilisation de la macro on réalise un effet de bord sur le paramètre effectif, cet effet de bord sera réalisé plusieurs fois. Exemple :
#define CARRE(a) ((a) * (a))
l'utilisation de CARRE(x++) aura comme expansion ((x++) * (x++)) et l'opérateur ++ sera appliqué deux fois.


next up previous contents index
Next: Erreurs avec l'instruction if Up: Le bêtisier Previous: Erreur avec les opérateurs
Bernard Cassagne
1998-12-09
Contacter le responsable de la rubrique C