Celui qui est timide * vous a donné le germe d'une respuesta mais seulement le germe. La technique de base pour convertir une valeur en chaîne de caractères dans le préprocesseur C est en effet via l'opérateur '#', mais une 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 se trouve sur la ligne 'puts()' - le problème est un 'stray #' dans la source.
Dans la section 6.10.3.2 de la norme C, "L'opérateur #", il est dit :
Chaque # jeton de prétraitement dans la de remplacement d'une macro de type fonction de type fonction doit être suivi d'un paramètre en tant qu'élément de prétraitement suivant dans la liste de remplacement de la fonction liste de remplacement.
Le problème est que vous pouvez convertir des arguments de macro en chaînes de caractères, mais vous ne pouvez pas convertir des éléments aléatoires qui ne sont pas des arguments de macro.
Ainsi, pour obtenir l'effet recherché, vous devez certainement faire un travail supplémentaire.
#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 comprends pas très bien comment vous comptez utiliser les macros et comment vous comptez éviter les répétitions. Cet exemple un peu plus élaboré pourrait être plus instructif. L'utilisation d'une macro équivalente à STR_VALUE est une idiome qui est 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é écrite pour la première fois, shoosh Le nom de l'enfant a utilisé "Shy" comme partie du nom.