2013-03-11 14 views
18

Ich möchte den Namen einer Funktion anzeigen, die ich anrufe. Hier ist mein CodeNennen Sie Funktionsname als Zeichenfolge

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

I verwendet __function__ als exemple, weil es ganz in der Nähe ist, was Ich mag würde, aber ich möchte den Namen der Funktion von tabFtPtr [nbExo] darauf angezeigt werden soll.

Dank mir geholfen :)

+1

C++ Version @ http://stackoverflow.com/q/679021/139010 –

+0

Es gibt keine Standard-Weg, dies zu tun . Welchen Compiler benutzen Sie? –

+3

Wie man den Namen der Funktion vom Funktionszeiger in C bekommt http://stackoverflow.com/questions/351134/how-to-get-functions-name-from-functions-pointer-in-c – zzk

Antwort

19

Sie benötigen einen C-Compiler, der den C99-Standard oder später folgt. Es gibt einen vordefinierten Bezeichner, der __func__ genannt wird, der tut, was Sie fordern.

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

Edit:

Als neugierig Referenz, der C-Standard 6.4.2.2 schreibt vor, dass die oben genau das gleiche, als wenn Sie explizit geschrieben hätten:

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

Edit 2:

Um den Namen über einen Funktionszeiger zu erhalten, könnten Sie beispielsweise Folgendes erstellen:

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<N; i++) 
    { 
    printf("%s", function[i](true, ...); 
    } 
} 
+0

Sie können diese Zeichenfolge jedoch nicht von einem Funktionszeiger abrufen, oder? –

+0

@CarlNorum Einfach die Funktion aufrufen. Die Funktion muss die __func__-Kennung irgendwie integrieren. – Lundin

+2

Ich sehe nicht wirklich, wie sich das mit der OP-Frage integrieren lässt, das ist alles.Er scheint die Funktionen nicht aufrufen zu wollen, greifen Sie einfach zur Laufzeit auf ihre Namen. –

1

Ich bin mir nicht sicher, ob du das willst, aber du könntest so etwas machen. Deklarieren eine Struktur, einen Funktionsnamen und die Adresse zu halten, und eine Reihe von Funktionen im Dateibereich:

#define FNUM 3 

struct fnc { 
    void *addr; 
    char name[32]; 
}; 

void (*f[FNUM])(); 
struct fnc fnames[FNUM]; 

Initialisiere diese im Code manuell von Funktionsnamen, z.B.

Eine Funktion zum Durchsuchen des Arrays, z.

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

Ich habe einen schnellen Test davon durchgeführt. Ich initialisierte das Array in main und rief foo1(). Hier ist meine Funktion, und die Ausgabe:

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' 

Oder allgemeiner:

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' 
+0

Für die Leistung ist dies vielleicht eine bessere Lösung, da es keinen zusätzlichen Aufwand für die Funktion hinzufügt. –

Verwandte Themen