__func__ oder __FUNCTION__ oder manuelle const char* id?

Lesezeit: 4 Minuten

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.

  • Ü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 #defines 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

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 1300also ä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 #defines 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.

Benutzer-Avatar
radj

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. 🙂

  • Nein, __func__ wurde von C99 hinzugefügt; es existiert nicht in C89/C90. Aber gcc unterstützt es für alle Versionen des Standards.

    – Keith Thompson

    20. September 2013 um 15:20 Uhr

1367430cookie-check__func__ oder __FUNCTION__ oder manuelle const char* id?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy