¿Cómo podemos saber el nombre de la función que llama?

En el lenguaje C, __FUNCTION__ se puede usar para obtener el nombre de la función actual . Pero si defino una función llamada a () y se llama en b (), como a continuación:

 b() { a(); } 

Ahora, en el código fuente, hay muchas funciones como b () que llaman a (), por ejemplo, c (), d (), e () …

¿Es posible, dentro de un (), agregar algún código para detectar el nombre de la función que llamó a ()?

Promover:

  1. Lo siento por el error tipográfico engañoso. Lo he corregido.
  2. Estoy tratando de averiguar qué función llama a () para fines de depuración. No sé cómo te va cuando estás en la misma situación?
  3. Y mi código está bajo vxWorks, pero no estoy seguro de si está relacionado con C99 o algo más.

No hay nada que puedas hacer solo en a.

Sin embargo, con un simple truco de macro estándar, puede lograr lo que quiere, IIUC mostrando el nombre de la persona que llama.

 void a() { /* Your code */ } void a_special( char const * caller_name ) { printf( "a was called from %s", caller_name ); a(); } #define a() a_special(__func__) void b() { a(); } 

Prueba esto:

 void a(); #ifdef DEBUG # define a() a_debug(, __FUNCTION__) void a_debug(, const char * calledby); #endif void b(void) { a(); } #ifdef DEBUG # undef a #endif void a() { printf("'%s' called\n", __FUNCTION__); } #ifdef DEBUG void a_debug(, const char * calledby) { printf("'%s' calledby '%s'", __FUNCTION__, calledby); a(); } #endif 

Si, por ejemplo, es int i, double d, void * p entonces es i, d, p .


O (menos mal; – >> – pero más modding de código, ya que cada llamada a a () necesita ser tocada):

 void a(( #ifdef DEBUG , const char * calledby #endif ); void a(( #ifdef DEBUG , const char * calledby #endif ) { #ifdef DEBUG printf("'%s' calledby '%s', __FUNCTION__, calledby); #endif ... } ... void b(void) { a( #ifdef DEBUG , __FUNC__ #endif ); } 

__FUNCTION__ está disponible en GCC (¿al menos?), Si usa un comstackdor C99 diferente, reemplácelo con __func__ .

Si está utilizando el sistema Linux, puede usar la función backtrace() .

Vea la página del manual para más detalles y un ejemplo de código.

Si su plataforma es Windows, puede usar esto: caminando por la stack de llamadas

Si solo después de saber dónde estaba para fines de registro / depuración, puede usar una macro para evitar que __func__ el nombre de su función de registro / depuración, pero de la función que lo llama.

Estar en una macro no resultará en un cambio a __func__ pero se “sentirá” como usar una función.

p.ej

 #define LOG(s, data...) log("%s: "s, __function__, ## data) 

Consulte: https://www.gnu.org/software/libc/manual/html_node/Backtraces.html

Un retroceso es una lista de las llamadas de función que están actualmente activas en un hilo. La forma habitual de inspeccionar un seguimiento de un progtwig es usar un depurador externo como gdb. Sin embargo, a veces es útil obtener un retroceso programático desde un progtwig, por ejemplo, para fines de registro o diagnóstico.

El archivo de cabecera execinfo.h declara tres funciones que obtienen y manipulan backtraces del hilo actual.

Puedes hacerlo con un gcc incorporado.

void * __builtin_return_address(int level)

La siguiente forma debe imprimir el llamador inmediato de una función a ().

Ejemplo:

 a() { printf ("Caller name: %pS\n", __builtin_return_address(0)); } 

Puede etiquetar cada función que llama a () con un identificador entero que se pasa a () como parámetro y luego usar una construcción de conmutación de mayúsculas en a () para indicar qué función ha invocado a () . A printf () diría qué función invocó a () dependiendo del valor del identificador de entero si usas eso como un argumento para una construcción de conmutación en un ()

 #include void a(int); void b(); void c(); void d(); int main(void) { b(); c(); d(); } void b() { int x=1; a(x); } void c() { int x=2; a(x); } void d() { int x=3; a(x); } void a(int x) { switch(x) { case 1: printf("b called me\n"); break; case 2: printf("c called me\n"); break; case 3: printf("d called me\n"); } } 
 #include  #include  

#define FUNCTION_NAME ( FUNCTION ) printf (” FUNCTION =% s \ r \ n”, # FUNCTION );

 int a() { printf("A function call"); } int b() { printf("B function call"); } int main(){ FUNCTION_NAME(a); FUNCTION_NAME(b); return 0; 

}