Comment faire une chaine de caractères à partir d'un C-macro de la valeur?
Par exemple, comment faire pour éviter d'écrire le "func_name" deux fois?
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME "func_name"
#endif
J'aimerais suivre le Point unique de la Vérité règle.
Version de préprocesseur C:
$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
- Double Possible de C Macros pour créer des chaînes
Vous devez vous connecter pour publier un commentaire.
Celui qui est Timide* vous a donné le germe d'une réponse, mais seulement le germe. La technique de base pour la conversion d'une valeur dans une chaîne de caractères dans le C pré-processeur est en effet via le '#' opérateur, mais une simple translittération de la solution proposée obtient une erreur de compilation:
L'erreur de syntaxe est sur la "puts ()" ligne - le problème, c'est un "parasite #" dans la source.
Dans la section 6.10.3.2 de la norme C 'Le # de l'opérateur, il est dit:
Le problème, c'est que vous pouvez convertir en macro arguments à cordes -- mais vous ne pouvez pas convertir des éléments aléatoires qui ne sont pas des arguments de la macro.
Donc, pour obtenir l'effet que vous êtes après, vous avez très certainement avoir à faire un peu de travail supplémentaire.
Je ne suis pas complètement clair sur la façon dont vous prévoyez d'utiliser les macros, et comment vous prévoyez d'éviter les répétitions au total. Ce peu plus élaborée exemple peut-être plus instructif. L'utilisation d'une macro équivalente à STR_VALUE est un idiome qui est nécessaire pour obtenir le résultat souhaité.
* Au moment de cette réponse a d'abord été écrit, shooshle nom utilisé "Timide" dans le nom.
__func__
) — bien sûr, en C99, on pourra utiliser le__func__
pré-identifiant défini dans la fonction de dire le nom de la fonction. Cependant, qui n'est d'aucun secours à l'extérieur de la fonction, et c'est là que le nom de la fonction de chaîne est vraiment nécessaire.test_func
devrait être une macro pour des OP cas je pense. Si vous mettez #define test_func my_test_func. (et donc de faire test_func une macro), elle affiche toujourstest_func
pasmy_test_func
.@Jonathan Leffler: je vous Remercie. Votre solution fonctionne.
Un travail complet exemple:
Exemple:
Référence: Wikipedia Préprocesseur C page
#define TEST_FUN_NAME #FUNC_NAME
voir ici