Recibe el nombre de la función como una cadena

Me gustaría mostrar el nombre de una función que estoy llamando. Aqui esta mi codigo

void (*tabFtPtr [nbExo])(); // Array of function pointers int i; for (i = 0; i < nbExo; ++i) { printf ("%d - %s", i, __function__); } 

Utilicé __function__ como un ejemplo porque está bastante cerca de lo que me gustaría pero quiero mostrar el nombre de la función señalada por tabFtPtr [nbExo] .

Gracias por ayudarme 🙂

Necesita un comstackdor de C que siga el estándar C99 o posterior. Hay un identificador predefinido llamado __func__ que hace lo que está pidiendo.

 void func (void) { printf("%s", __func__); } 

Editar:

Como referencia curiosa, el estándar C 6.4.2.2 dicta que lo anterior es exactamente lo mismo que si hubiera escrito explícitamente:

 void func (void) { static const char f [] = "func"; // where func is the function's name printf("%s", f); } 

Edición 2:

Entonces, para obtener el nombre a través de un puntero de función, podría construir algo como esto:

 const char* func (bool whoami, ...) { const char* result; if(whoami) { result = __func__; } else { do_work(); result = NULL; } return result; } int main() { typedef const char*(*func_t)(bool x, ...); func_t function [N] = ...; // array of func pointers for(int i=0; i 

No estoy seguro de que esto sea lo que quieres, pero podrías hacer algo como esto. Declare una estructura para mantener el nombre y la dirección de una función, y una serie de funciones en el scope del archivo:

 #define FNUM 3 struct fnc { void *addr; char name[32]; }; void (*f[FNUM])(); struct fnc fnames[FNUM]; 

Inicialice estos en su código manualmente por nombre de función, por ejemplo

  fnames[0] = (struct fnc){foo1, "foo1"}; // function address + its name fnames[1] = (struct fnc){foo2, "foo2"}; fnames[2] = (struct fnc){foo3, "foo3"}; 

Haga una función para buscar la matriz, por ejemplo,

 char *getfname(void *p) { for (int i = 0; i < FNUM; i++) { if (fnames[i].addr == p) return fnames[i].name; } return NULL; } 

Hice una prueba rápida de esto. Inicialicé la matriz en main , y llamé foo1() . Aquí está mi función, y la salida:

 void foo1(void) { printf("The pointer of the current function is %p\n", getfnp(__func__)); printf("The name of this function is %s\n", getfname(getfnp(__func__))); printf("The name of the function at pointer f[2] (%p) is '%s'\n", f[2], getfname(f[2])); } The pointer of the current function is 0x400715 The name of this function is foo1 The name of the function at pointer f[2] (0x40078c) is 'foo3' 

O, más generalmente:

 void foo2(void) { for (int i = 0; i < FNUM; i++) { printf("Function f[%d] is called '%s'\n", i, getfname(f[i])); } } Function f[0] is called 'foo1' Function f[1] is called 'foo2' Function f[2] is called 'foo3'