Les macros



Nous avons vu qu'avec le #define on pouvait demander au préprocesseur de remplacer un mot par une valeur. Par exemple :

#define NOMBRE 9


… signifie que tous les NOMBRE de votre code seront remplacés par 9. Nous avons vu qu'il s'agissait en fait d'un simple rechercher-remplacer fait par le préprocesseur avant la compilation.

J'ai du nouveau ! En fait, le #define est encore plus puissant que ça. Il permet de remplacer aussi par… un code source tout entier ! Quand on utilise #define pour rechercher-remplacer un mot par un code source, on dit qu'on crée une macro.

Macro sans paramètres


Voici un exemple de macro très simple :

#define COUCOU() printf("Coucou");


Ce qui change ici, ce sont les parenthèses qu'on a ajoutées après le mot-clé (ici COUCOU()). Nous verrons à quoi elles peuvent servir tout à l'heure.

Testons la macro dans un code source :

#define COUCOU() printf("Coucou");


int main(int argc, char *argv[])

{

    COUCOU()


    return 0;

}



Coucou


Je vous l'accorde, ce n'est pas original pour le moment. Ce qu'il faut déjà bien comprendre, c'est que les macros ne sont en fait que des bouts de code qui sont directement remplacés dans votre code source juste avant la compilation.


Le code qu'on vient de voir ressemblera en fait à ça lors de la compilation :

int main(int argc, char *argv[])

{

    printf("Coucou");


    return 0;

}


Si vous avez compris ça, vous avez compris le principe de base des macros.


Mais… on ne peut mettre qu'une seule ligne de code par macro ?


Non, heureusement il est possible de mettre plusieurs lignes de code à la fois. Il suffit de placer un \ avant chaque nouvelle ligne, comme ceci :

#define RACONTER_SA_VIE()   printf("Coucou, je m'appelle Brice\n"); \

                            printf("J'habite a Nice\n"); \

                            printf("J'aime la glisse\n");


int main(int argc, char *argv[])

{

    RACONTER_SA_VIE()


    return 0;

}



Coucou, je m'appelle Brice

J'habite a Nice

J'aime la glisse



Remarquez dans le main que l'appel de la macro ne prend pas de point-virgule à la fin. En effet, c'est une ligne pour le préprocesseur, elle ne nécessite donc pas d'être terminée par un point-virgule.

Macro avec paramètres


Pour le moment, on a vu comment faire une macro sans paramètre, c'est-à-dire avec des parenthèses vides. Le principal intérêt de ce type de macros, c'est de pouvoir « raccourcir » un code un peu long, surtout s'il est amené à être répété de nombreuses fois dans votre code source.

Cependant, les macros deviennent réellement intéressantes lorsqu'on leur met des paramètres. Cela marche quasiment comme avec les fonctions.

#define MAJEUR(age) if (age >= 18) \

                    printf("Vous etes majeur\n");


int main(int argc, char *argv[])

{

    MAJEUR(22)


    return 0;

}



Vous etes majeur


Notez qu'on aurait aussi pu ajouter un else pour afficher « Vous êtes mineur ». Essayez de le faire pour vous entraîner, ce n'est pas bien difficile. N'oubliez pas de mettre un antislash \ avant chaque nouvelle ligne.


Le principe de notre macro est assez intuitif :

#define MAJEUR(age) if (age >= 18) \

                    printf("Vous etes majeur\n");


On met entre parenthèses le nom d'une « variable » qu'on nomme age. Dans tout notre code de macro, age sera remplacé par le nombre qui est indiqué lors de l'appel à la macro (ici, c'est 22).

Ainsi, notre code source précédent ressemblera à ceci juste après le passage du préprocesseur :

int main(int argc, char *argv[])

{

    if (22 >= 18)

    printf("Vous etes majeur\n");


    return 0;

}


Le code source a été mis à la place de l'appel de la macro, et la valeur de la « variable » age a été mise directement dans le code source de remplacement.

Il est possible aussi de créer une macro qui prend plusieurs paramètres :

#define MAJEUR(age, nom) if (age >= 18) \

                    printf("Vous etes majeur %s\n", nom);


int main(int argc, char *argv[])

{

    MAJEUR(22, "Maxime")


    return 0;

}



Voilà tout ce qu'on peut dire sur les macros. Il faut donc retenir que c'est un simple remplacement de code source qui a l'avantage de pouvoir prendre des paramètres.


Normalement, vous ne devriez pas avoir besoin d'utiliser très souvent les macros. Toutefois, certaines bibliothèques assez complexes comme wxWidgets ou Qt (bibliothèques de création de fenêtres que nous étudierons bien plus tard) utilisent beaucoup de macros. Il est donc préférable de savoir comment cela fonctionne dès maintenant pour ne pas être perdu plus tard.

Créé avec HelpNDoc Personal Edition: Créer de la documentation iPhone facilement