Wie können wir den Namen der aufrufenden Funktion erfahren?
Lesezeit: 5 Minuten
Tom Xue
In der C-Sprache __FUNCTION__ kann verwendet werden, um die zu erhalten aktuell Funktionsname. Aber wenn ich eine Funktion namens a() definiere und sie in b() aufgerufen wird, wie unten:
b()
{
a();
}
Nun, im Quellcode gibt es viele Funktionen wie b(), die a() aufrufen, zB c(), d(), e()…
Ist es möglich, innerhalb von a() Code hinzuzufügen, um den Namen der Funktion zu erkennen, die a() aufgerufen hat?
Des Weiteren:
Sorry für den irreführenden Tippfehler. Ich habe es korrigiert.
Ich versuche herauszufinden, welche Funktion a() zu Debugging-Zwecken aufruft. Ich weiß nicht, wie es dir geht, wenn du in der gleichen Situation bist?
Und mein Code ist unter vxWorks, aber ich bin mir nicht sicher, ob er mit C99 oder etwas anderem zusammenhängt.
Nicht sicher. Aber das ist vielleicht hilfreich für Sie
– Suvarna Pattayil
19. April 2013 um 8:10 Uhr
Warum willst du das tun? Ist es für Debugging-Zwecke?
– fstamour
19. April 2013 um 8:13 Uhr
Wenn dies nur zum Debuggen dient, können Sie a als Makro definieren und so verwenden __func__ wird b zurückgeben, wie Sie möchten.
– Jo
19. April 2013 um 8:15 Uhr
Welcher Compiler hat FUNKTION um den Namen der aktuellen Funktion zurückzugeben? Der dafür im C-Standard vorgesehene Bezeichner ist __func__ IIRC.
– Jens Gustedt
19. April 2013 um 8:18 Uhr
was du schreibst ist falsch. __FUNC__ gibt den aktuellen Methodennamen AFAIK zurück. Um den Anrufer zu erhalten, müssten Sie sich den Stacktrace ansehen
– Daij-Djan
19. April 2013 um 8:19 Uhr
Didier Trosset
Es gibt nichts, was Sie nur in a tun können.
Mit einem einfachen Standard-Makrotrick können Sie jedoch erreichen, was Sie wollen, IIUC zeigt den Namen des Anrufers an.
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();
}
Ich musste die Variable caller_name als deklarieren const char* caller_nameaber es hat funktioniert!
– roter Curry
11. Februar 2014 um 18:33 Uhr
Präzision: __func__ ist Teil des C99-Standards, […] __FUNCTION__ ist ein anderer Name für __func__, bereitgestellt für die Abwärtskompatibilität mit alten Versionen von GCC. (Quelle: gcc.gnu.org/onlinedocs/gcc/Function-Names.html)
– Camille G.
2. Juni 2017 um 9:18 Uhr
Können Sie mir bitte sagen, wie ich Ihr Beispiel mit Auslassungspunkten in der Funktionsdeklaration verwenden kann? void a(int a, char *fmt, ...) Wie kann ich es in die Makrodefinition aufnehmen?
– Alejandro Galera
9. Januar 2019 um 12:56 Uhr
@mulg0r Schau mal rein va_list , va_arg und Gefährten. Ich bezweifle jedoch, dass Sie diesen Trick auf eine Funktion mit Auslassungszeichen anwenden können: Es sollte mit geschrieben werden va_list stattdessen, genau wie die vprintf Funktionsreihe 🙁
– Didier Trosset
10. Januar 2019 um 12:57 Uhr
@mulg0r Verwenden Variadische Makros Sie können erreichen, was Sie wollen (z.#define a(...) a_special (__func__, __VA_ARGS__)für eine Funktion void a_special(char const * caller_name, ...){}) Sie gibt es in C seit C99 und in C++ seit C++11.
Ein Backtrace ist eine Liste der Funktionsaufrufe, die derzeit in einem Thread aktiv sind. Der übliche Weg, einen Backtrace eines Programms zu untersuchen, ist die Verwendung eines externen Debuggers wie gdb. Manchmal ist es jedoch nützlich, einen Backtrace programmgesteuert innerhalb eines Programms zu erhalten, z. B. für Protokollierungs- oder Diagnosezwecke.
Die Header-Datei execinfo.h deklariert drei Funktionen, die Backtraces des aktuellen Threads erhalten und manipulieren.
Jo
Wenn Sie erst wissen möchten, wo Sie sich zu Protokollierungs-/Debugzwecken befunden haben, können Sie ein Makro verwenden, um dies zu vermeiden __func__ Angabe des Namens Ihrer Protokollierungs-/Debug-Funktion, aber der Funktion, die sie aufruft.
In einem Makro zu sein, führt nicht zu einer Änderung von __func__ aber “fühlen” sich an, als würden Sie eine Funktion verwenden.
Nicht sicher. Aber das ist vielleicht hilfreich für Sie
– Suvarna Pattayil
19. April 2013 um 8:10 Uhr
Warum willst du das tun? Ist es für Debugging-Zwecke?
– fstamour
19. April 2013 um 8:13 Uhr
Wenn dies nur zum Debuggen dient, können Sie a als Makro definieren und so verwenden
__func__
wird b zurückgeben, wie Sie möchten.– Jo
19. April 2013 um 8:15 Uhr
Welcher Compiler hat FUNKTION um den Namen der aktuellen Funktion zurückzugeben? Der dafür im C-Standard vorgesehene Bezeichner ist
__func__
IIRC.– Jens Gustedt
19. April 2013 um 8:18 Uhr
was du schreibst ist falsch.
__FUNC__
gibt den aktuellen Methodennamen AFAIK zurück. Um den Anrufer zu erhalten, müssten Sie sich den Stacktrace ansehen– Daij-Djan
19. April 2013 um 8:19 Uhr