![]()
Erreurs avec les macros ![]()
![]()
![]()
![]()
![]()
Suivant: Erreurs avec l'instruction if Début: Le bêtisier Précédent: Erreur avec les opérateurs
Paragraphes
- Un #define n'est pas une déclaration
- Un #define n'est pas une initialisation
- Erreur sur macro avec paramètres
- Erreur avec les effets de bord
Erreurs avec les macros
Le mécanisme des macros est réalisé par le préprocesser 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 expansionx = 10;;
, ce qui est licite : il y a une instruction nulle derrièrex = 10;
.- -
- L'utilisation
int t[MAX];
aura pour expansionint 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 deCARRE(x++)
aura comme expansion((x++) * (x++))
et l'opérateur ++ sera appliqué deux fois.
30/9/1997