Ich frage mich, wie weit verbreitet sind __func__
(Teil von C99, aber ich kompiliere als C89) und __FUNCTION__
unterstützt.
Ich habe eine alte Codebasis, die hauptsächlich manuell verwendet wird const char* id;
Variablen, die dann an verschiedene (meist protokollierende) Funktionen übergeben werden. Ich möchte das loswerden und den Funktionsnamen in ein Makro verschieben.
Der vordefinierte Bezeichner __func__
wurde 1999 in den ISO-C-Standard aufgenommen; der ältere C-Standard von 1990 hat es nicht.
Unterstützung für __func__
in Pre-C99-Compilern hängt davon ab, welchen Compiler Sie verwenden.
Moderne Versionen der gcc-Unterstützung __func__
sogar im C90-Modus (-ansi
oder -std=c89
).
Vor __func__
zum Standard hinzugefügt wurde, implementierte gcc eine eigene äquivalente Erweiterung, jedoch mit dem Namen __FUNCTION__
. (gcc unterstützt auch __PRETTY_FUNCTION__
was identisch ist mit __func__
und __FUNCTION__
für C, bietet aber mehr Informationen in C++.)
Das gcc-Handbuch gibt einen Rat:
__FUNCTION__
ist ein anderer Name für __func__
. Ältere Versionen von GCC erkennen nur diesen Namen. Es ist jedoch nicht standardisiert. Für maximale Portabilität empfehlen wir die Verwendung von __func__
aber geben Sie eine Fallback-Definition mit dem Präprozessor an:
#if __STDC_VERSION__ < 199901L
# if __GNUC__ >= 2
# define __func__ __FUNCTION__
# else
# define __func__ "<unknown>"
# endif
#endif
was impliziert, dass gcc Unterstützung für hinzugefügt hat __FUNCTION__
in Version 2. gcc 2.0 wurde veröffentlicht 1992; Es ist sehr unwahrscheinlich, dass Sie eine Version von gcc verwenden, die nicht mindestens unterstützt __FUNCTION__
wenn nicht __func__
.
Beachten Sie das seit __func__
und __FUNCTION__
sind vordefinierte Bezeichner, keine Makros, man braucht nur die #define
einmal, nicht in jeder Funktion. Auf der anderen Seite können Sie nicht verwenden #ifdef __func__
oder #ifdef __FUNCTION__
um die Unterstützungsstufe zu erkennen.
Wie bei anderen Compilern zeigt ein kurzes Experiment, dass Microsoft Visual C++ 2010 Express unterstützt __FUNCTION__
aber nicht __func__
oder __PRETTY_FUNCTION__
, beim Kompilieren von C-Code. Der obige Codeblock aus dem gcc-Handbuch wird unter MSVC kompiliert, führt jedoch zu __func__
definiert werden als "<unknown>"
. Es sollte nicht zu schwierig sein, es anzupassen, um zu erkennen, dass MSVC unterstützt __FUNCTION__
. (Ich weiß nicht, ob ältere Versionen dies tun.) Sie können wahrscheinlich das vordefinierte Makro verwenden _MSC_VER
dafür. Dokumentation von Microsoft sagt, dass Unterstützung für __FUNCTION__
geht zumindest auf die Veröffentlichung von 2003 zurück, die einstellt _MSC_VER
zu 1300
also ändern Sie die zweite Zeile in
# if __GNUC >= 2 || _MSC_VER >= 1300
ist ein guter Anfang. (Möglicherweise wurde es in früheren Versionen unterstützt.)
Für andere Compiler als gcc und MSVC müssen Sie die entsprechende Dokumentation konsultieren — aber in jedem Fall sollte der im gcc-Handbuch empfohlene Codeblock für jeden Compiler funktionieren, im schlimmsten Fall auf ihn zurückgreifen "<unknown>"
.
Der Schub aktuelle_funktion.hpp Header enthält mehrere #define
s für die Möglichkeiten, die aktuelle Funktion auf verschiedenen Plattformen zu erhalten.
Das soll nicht heißen, dass diese Plattformen keine anderen Möglichkeiten zum Abrufen der aktuellen Funktion unterstützen, aber die für Boost getroffenen Entscheidungen stellen wahrscheinlich nette (wenn nicht die netteste) Möglichkeiten dar, die Informationen auf diesen Plattformen zu erhalten.
Eine Anpassung dieses Headers für Ihren Code (und für C) könnte durchaus das sein, was Sie brauchen.
Ich glaube, es ist egal, welcher C-Standard verwendet wird (ob C89 oder C99). Der wichtigere Faktor ist der verwendete Compiler, da er implementiert wird __func__
. Die neuesten GCC-Compiler werden hinzugefügt __func__
unabhängig vom verwendeten Standard. Ich finde. 🙂
Überprüfen Sie die Verstärkung aktuelle_funktion.hpp Header. Ich weiß, dass Sie dies für C fragen, und Sie können diesen Header nicht direkt verwenden. Aber trotzdem, mit Blick auf die
#define
s gibt eine gute Vorstellung davon, welche Compiler welche Methoden zum Abrufen der aktuellen Funktion unterstützen.– Sander DeDycker
10. August 2011 um 12:02 Uhr
@Sander Das ist eine Art Antwort. Könntest du es zu einem machen?
– Simon Toth
10. August 2011 um 15:11 Uhr
Ich war mir nicht sicher, ob es Ihre Frage beantworten würde, aber ich denke, Sie haben diesen Zweifel ausgeräumt. Gleich als Antwort gepostet.
– Sander DeDycker
10. August 2011 um 17:04 Uhr