Je sais que c'est longtemps après la requête d'origine, mais cela peut encore être utile.
Cela peut être fait dans GCC en utilisant l'opérateur stringify "#", mais cela nécessite deux étapes.
#define XSTR(x) STR(x)
#define STR(x) #x
La valeur d'une macro peut alors être affichée avec:
#pragma message "The value of ABC: " XSTR(ABC)
Voir: 3.4 Stringification dans la documentation en ligne de gcc.
Comment ça fonctionne:
Le préprocesseur comprend les chaînes entre guillemets et les gère différemment du texte normal. La concaténation de chaînes est un exemple de ce traitement spécial. Le pragma de message nécessite un argument qui est une chaîne entre guillemets. Lorsqu'il y a plus d'un composant à l'argument, ils doivent tous être des chaînes pour que la concaténation de chaînes puisse être appliquée. Le préprocesseur ne peut jamais supposer qu'une chaîne sans guillemets doit être traitée comme si elle était entre guillemets. Si c'est le cas, alors:
#define ABC 123
int n = ABC;
ne compilerait pas.
Considérez maintenant:
#define ABC abc
#pragma message "The value of ABC is: " ABC
ce qui équivaut à
#pragma message "The value of ABC is: " abc
Cela provoque un avertissement du préprocesseur car abc (sans guillemets) ne peut pas être concaténé avec la chaîne précédente.
Considérons maintenant le préprocesseur stringize (qui était autrefois appelé stringification, les liens dans la documentation ont été modifiés pour refléter la terminologie révisée. (Les deux termes, d'ailleurs, sont tout aussi détestables. Le terme correct est, bien sûr, stringifaction. Soyez prêt à mettre à jour vos liens.)) opérateur. Cela n'agit que sur les arguments d'une macro et remplace l'argument non développé par l'argument entre guillemets. Donc:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
attribuera des valeurs identiques à s1 et s2. Si vous exécutez gcc -E, vous pouvez le voir dans la sortie. Peut-être que STR serait mieux nommé quelque chose comme ENQUOTE.
Cela résout le problème de placer des guillemets autour d'un élément sans guillemets, le problème est maintenant que, si l'argument est une macro, la macro ne sera pas développée. C'est pourquoi la deuxième macro est nécessaire. XSTR développe son argument, puis appelle STR pour mettre la valeur développée entre guillemets.