He who is Shy* vous a donné le germe d'un answer, mais seulement le germe. La technique de base pour convertir une valeur en une chaîne dans le pré-processeur C est en effet par l'intermédiaire de l'opérateur « # », mais un simple translittération de la solution proposée obtient une erreur de compilation:
#define TEST_FUNC test_func
#define TEST_FUNC_NAME #TEST_FUNC
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
L'erreur de syntaxe est en la ligne 'puts()' - le problème est un 'errant #' dans la source.
Dans la section 6.10.3.2 de la norme C, « L'opérateur # », il dit:
Each # preprocessing token in the replacement list for a function-like macro shall be followed by a parameter as the next preprocessing token in the replacement list.
Le problème est que vous pouvez convertir arguments macro en chaînes - mais vous ne pouvez pas convertir au hasard les éléments qui ne sont pas des arguments de macro. Donc, pour obtenir l'effet que vous recherchez, vous devrez certainement faire un peu plus de travail.
#define FUNCTION_NAME(name) #name
#define TEST_FUNC_NAME FUNCTION_NAME(test_func)
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
Je ne suis pas tout à fait clair sur la façon dont vous envisagez d'utiliser les macros, et comment vous prévoyez d'éviter la répétition tout à fait. Cet exemple légèrement plus élaboré pourrait être plus instructif. L'utilisation d'une macro équivalente à STR_VALUE est un idiome nécessaire pour obtenir le résultat souhaité.
#define STR_VALUE(arg) #arg
#define FUNCTION_NAME(name) STR_VALUE(name)
#define TEST_FUNC test_func
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)
#include <stdio.h>
static void TEST_FUNC(void)
{
printf("In function %s\n", TEST_FUNC_NAME);
}
int main(void)
{
puts(TEST_FUNC_NAME);
TEST_FUNC();
return(0);
}
* Au moment où cette réponse a été écrit, shoosh « nom utilisé « Timide » dans le cadre du nom.
double possible de [C macros pour créer des chaînes] (http://stackoverflow.com/questions/798221/c-macros -to-create-strings) – rjstelling