Show Macro value
- Renaud Jordi
- 29 janv. 2024
- 2 min de lecture
Astuce en C pour afficher le contenu d’une macro dans la console du compilateur ;)
Le rêve des développeurs ? 😀 Je vous montre.
Vous avez certainement déjà eu le cas, où votre code ne compile pas à cause de la valeur incorrecte d’une macro. Quand le code est simple, on peut rapidement la retrouver, mais pas toujours… et exécuter un printf n’est pas toujours possible si votre cible n’a pas de sortie standard.
Voyons pas à pas…
Vous connaissez sûrement les principaux usages des macros.
En premier, la définition classique, réutilisable dans le code
#define MAX_SIZE 1024
int array[MAX_SIZE];
Ensuite, des fonctions macros avec le classique
#define SUM(a, b) ((a)+(b))
et ses effets de bords… (le sujet d’un autre post ?)
Mais on peut aller plus loin avec la mise en chaine de caractères avec le #
Cet opérateur permet d’encapsuler le paramètre avec des guillemets et ne s’utilise qu’avec un paramètre de macro.
STR(Bonjour) sera remplacé par “Bonjour”
Mais cet opérateur a la priorité sur le remplacement textuel des macros
donc printf(STR(MAX_SIZE)) sera remplacé par printf(”MAX_SIZE”)
Ce n’est pas encore ce qu’on veut, mais on s’en approche.
Rajoutons une macro
#define XSTR(x) STR(x)
Lors d’un printf(XSTR(MAX_SIZE)), le déploiement de cette macro s’effectuera en 2 étapes
1re itération :
D’abord, remplacement des macro fonctions
Pas de # en vue, donc on continue avec le remplacement des macro simples. Ce qui donne :
printf(STR(1024))
Des macros sont toujours présentes, donc 2e itération :
D’abord, remplacement des macro fonctions
Puis exécution du #
printf(”1024”)
Yay ! 🙂
On peut aussi s’amuser à assembler les 2
Notez la concaténation de chaines de caractères, séparées par un espace, parfaitement valide en C.
printf(XTR2(MAX_SIZE)) affichera dans la console MAX_SIZE = 1024
Mais ce printf ne s’affichera qu’au moment de l’exécution, donc autant utiliser un printf(”%d”, MAX_SIZE)...
Alors comment l’afficher au moment de la compilation ?
Grâce au #pragma. Cette macro permet d’envoyer des paramètres au compilateur, tel que placer des variables dans une section particulière ou gérer l’alignement des variables. Ces paramètres sont spécifiques au compilateur utilisé, mais certains se sont standardisés comme le “message”
#pragma message "Hello there !"
affichera un message simple au moment de la compilation, mais un
#pragma message XSTR2(MAX_SIZE)
vous affichera MAX_SIZE = 1024 dans la console, au moment de la compilation 😎
Et voilà comment faire parler votre compilateur 🙂
Long story short :
#define MACRO_NAME 42
#define STR(x) #x
#define XSTR(x) STR(x)
#define XSTR2(x) #x " = " STR(x)
#pragma message("MACRO_NAME = " XSTR(MACRO_NAME))
#pragma message(XSTR2(MACRO_NAME)
Un autre exemple pratique :
la macro PRINTF_SIZEOF(char) va se résoudre en
printf("sizeof(" "char" ") = %zd.\n"), sizeof(char));
Notez la concaténation des chaines de caractères, séparées par un espace, parfaitement valide en C
