[Programmation] Les X-macros

Salut à tous! Comme promis, voici la nouvelle astuce que j’ai découverte en C/C++ pour un projet scolaire.

Vous avez probablement déjà vu des énumérations si vous avez fait, ne serait-ce qu’un peu, de C ou de C++. C’est adorable comme tout, voyez plutôt1 :

Donc, c’est jôli mais on a un petit problème. Je veux afficher le nom de la valeur sur une sortie quelquonque. Malheuresement, pas moyen d’afficher autre chose que des entiers car le compilateur ne fait que remplacer ces valeurs soit par des valeurs incrémentielles (de 0 à n) soit donner les valeurs que vous expliciterez :

Et pour éventuellement afficher le nom des valeurs…

Avec trois valeurs, c’est court mais imaginez la sauce avec une énumération de 30 items! C’est devant cet obstacle que j’ai cherché sur Internet un bout de code que j’avais vu par hasard qui permettrait d’associer un nom aux énumérés. Je vous présente les X-macros.

L’astuce est de se servir d’un fichier externe qui ne va contenir que les définitions pour un seul enum et de l’inclure dans le code en definissant les macros sur le vol. Ainsi, pour la même liste, vous pouvez l’appeler d’une manière pour avoir une liste de valeurs et d’une autre pour avoir les mêmes valeurs mais celles-ci entre guillemets pour avoir une liste de strings. Voici un exemple venant du projet scolaire qui m’a affronté à ça (j’ai changé les noms pour que ça soit plus explicite) :

Ainsi, pour chaque utilisation, je demande duex choses différentes pour le préprocesseur, regardez ci-dessus les lignes 3 et 9.

Avec cette astuce, vous avez une énumération ainsi qu’une liste de strings qui sont définis de la même manière. On divise par deux la maintenance!

Cas Particulier des négatifs

Le défaut avec cette méthode est qu’elle nous empêche d’utiliser des littéraux définis ou négatifs. J’ai trouvé une bidouille pour la deuxième. il suffit de les définir après les positifs et d’aller ensuite de -1 à -n.

Et les implémentations :

La macro X_V, va au choix assimiler b pour définir une valeur à un item, soit oublier b et ne laisser que le nom de la valeur pour le string. Malin, non? Pour ensuite accéder aux strings des valeurs négatives :

Et voilà. Et comment d’une bidouille crasse on arrive à une fonctionnalité pas trop moche. J’espère que cela pourra vous être utile. Moi, elle m’a permis de nettoyer une fonction en quelque chose de bien plus flexible. Allez, sur ce, je vous laisse avec ce nouveau joujou! A plus!


  1. Oui, j’ai enfin installé un plugin pour colorer le code. Joie, bonne humeur et petits chiots écrasés. D’ailleurs je dois modifier le thème pour l’intégrer avec le style du blog. Des heures de joie en perspective… ↩︎