Next: Erreurs avec l'instruction if
Up: Le bêtisier
Previous: Erreur avec les opérateurs
Sous-sections
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.
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.
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.
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) |
|
|
|
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: Erreurs avec l'instruction if
Up: Le bêtisier
Previous: Erreur avec les opérateurs
Bernard Cassagne
1998-12-09