Le Préprocessor

Macros de remplacement

 

Syntaxe :

       Macro <Nom> [(Parametre [, ...])]]
         …
       EndMacro

Une macro de remplacement fait partie des directives du compilateur. Les directives du compilateur peuvent être utilisées pour modifier le code du fichier source avant qu'il ne soit syntaxiquement et sémantiquement analysé et converti.

Parmi les directives du compilateur, on trouve entre autre l'inclusion de fichiers sources (IncludeFile, XIncludeFIle), l'inclusion conditionnelle (CompilerIf, CompilerSelect...), les fonctions du compilateur (SizeOf, OffsetOf), les commandes de débuggage (CallDebugger, Debug ...) mais surtout celles qui nous intéressent ici: les macros de remplacement (Macro, EndMacro).

En définissant des macros de remplacement, plus couramment appelées macros, on peut effectuer des substitutions dans le fichier source.

Macro simple

Une instruction Macro se travaille presque comme une instruction Procedure, à ceci prêt qu'au moment de la compilation, le nom de la macro sera substitué par son contenu.

Ex :

Macro Ma_Macro
Debug "Test Macro"
EndMacro

Ma_Macro

Lors de la compilation, ce code sera équivalent à,

Debug "Test Macro"

Arguments de Macro

Comme pour une procédure, les macros peuvent utiliser des paramètres formels entre parenthèses et séparés par des virgules. Quand la macro est invoquée, les véritables arguments remplacent les paramètres en leurs lieux et places dans le code de la macro.

Ex :

Macro Mon_Addition(Parametre1, Parametre2)
Debug Parametre1+Parametre2
EndMacro

Mon_Addition(10,5)

Lors de la compilation, ce code donnera,

Debug 10+5

Mais à la différence des procédures, il n'est pas possible d'attribuer un type aux paramètres. Cela provoque une erreur de syntaxe que le compilateur ne manquera pas de vous signaler, mais cela à l'avantage de rendre une macro trés flexible. Aussi si l'on reprend le code précédent, on peut aussi l'appliquer directement à des chaines de caractères!

Concaténation dans les Macro

En fait, il faut comprendre et ne pas oublier que dans une macro, tout n'est que substitution: pour un paramètre --> sa valeur associée. A l'utilisateur de faire attention!

Hors, cette substitution n'a lieu que si le compilateur trouve exactement le paramètre mots pour mots et isolé.

Ex :

Macro Ma_Macro(Parametre1, Parametre2)
Debug Parametre1Parametre2
EndMacro

Ma_Macro(10,5)

donnera literalement,

Debug Parametre1Parametre2

et non

Debug 105

car les mots Parametre1 et Parametre2 sont accolés et forment un seul mot.

Afin de pouvoir obtenir le résultat souhaité, il est possible de réaliser des concaténations grâce à l'opérateur #, ce qui nous donne,

Macro Ma_Macro(Parametre1, Parametre2)
Debug Parametre1#Parametre2
EndMacro

Ma_Macro(10,5)

Cette fois, l'instruction Ma_Macro (10,5) sera bien substituée par Debug 105.

Macro Imbriquées

Les macros peuvent être imbriquées les unes dans les autres pour réaliser des substitutions élaborées

Ex :

Macro Mon_Addition(Parametre1, Parametre2)
(Parametre1+Parametre2)
EndMacro

Macro Ma_Multiplication(Parametre1, Parametre2)
Parametre1*Parametre2
EndMacro

Debug Ma_Multiplication(Mon_Addition(10,5),3)

Lors de la compilation, ce code donnera,

Debug (10+5)*3

Notez la précaution prise des parenthèses dans la macro Mon_Addition afin de maîtriser l'ordre des opérations du calcul final.

Voir aussi

POO: Les macros sont utilisées pour définir un jeu d'instructions complet pour la programmation POO.

Sommaire


Retour en haut de page