Macro-insructions
macros
Accueil

du site

Voici un élément de programmation peu recommendable, de moins en moins utilisé en C++,
mais qu'il faut néanmoins connaître, vu qu'on le rencontre encore souvent.

 

D'abord, qu'est-ce que le PRÉPROCESSEUR ?


On appelle "préprocesseur" un programme qui intervient automatiquement entre le moment où on lance la compilation et la compilation elle-même.

Ce programme traite et modifie le texte à compiler suivant de directives indiquées par le programmeur, généralement en tête de fichier.

Ces directives sont écrites en début de ligne et précédées d'un dièse #.

Exemples :

#include <stdio.h>
ou
#define pi 3.14159265359

Nous avons déjà rencontré la directive "#include <stdio.h>" qui avait pour effet d'inclure le fichier "stdio.h" dans le texte source à compiler.
Cette opération n'a rien à voir avec les macros, précisons-le, le seul point commun étant le préprocesseur .

Nous nous intéressons Ici à la directive : #define

 

 

Macroinstructions ou macros

 

Un ou une macro est, non pas une instruction, mais une directive destinée au préprocesseur du type ::

#define identificateur chaine_de_caracteres

Exemples :

#define pi 3.14159265359
#define moyenne( x , y ) ( x+ y) / 2

La première forme :
#define pi 3.14159265359
demande au préprocesseur de remplacer purement et simplement
toutes les occurrences de pi par 3.14159265359 dans la totalité du texte source qui suit cette directive.
Bien évidemment, l'effet de cette directive se limite au fichier contenant la directive. Il ne s'étent pas à d'éventuels fichiers source supplémentaires que pourrait comporter le programme.

La seconde forme :
#define moyenne( x , y ) ( x+ y) / 2
souvent appelée "macro paramétrée" remplace également et dans les mêmes conditions que précédemment, toutes les occurrences de moyenne( x , y ) par ( x+ y) / 2 , mais les paramètres x et y peuvent être variables.
Un exemple :

#define moyenne(a,b) ((a+b)/2)

int main()

{
-float a = 3.0;
-float b = 7.0;
-printf("Moyenne de %f et %f = %f\n",a,b,moyenne(a,b));
-printf("Moyenne de %f et %f = %f\n",a,moyenne(a,b),moyenne(a,moyenne(a,b)));

-return 0;
}

Affichage :

Moyenne de 3.000000 et 7.000000 = 5.000000
Moyenne de 3.000000 et 5.000000 = 4.000000
Press any key to continue

Seulement voilà : les macros peuvent vous jouer des tours difficiles à prévoir !

#define carre(a) a*a

int main()
{
-float a = 3.0;
-a = carre(a+2);
-printf("Valeur de a : %f\n",a);

-return 0;
}

Affichage

Valeur de a : 11.000000
Press any key to continue

C'est evidemment faux ! car le carré de 3+2 = 5 est manifestement 25 et pas 11

Que s'est-il pasé ?

Mettons-nous à la place du préprocesseur :

#define carre(a) a*a

int main()
{
-float a = 3.0;
-a = a+2*a+2;
-printf("Valeur de a : %f\n",a);

-return 0;
}

a+2*a+2 == 3+2*3+2 == 3+6+2 == bel et bien 11

Pour tout arranger il eut suffi d'écrire le macro :

#define carre(a) (a)*(a)

Au remplacement : -a = (a+2)*(a+2);

Voilà pourquoi vous ne devez écrire des macro
que si vous ne pouvez vraiment pas faire autrement !

Voir notre rubrique : Variables & Constantes

 


Sommaire Langage C
Accueil

du site