Wenn ich die __FUNCTION__
-Makro / -Variable verwende, um Debugging-Informationen auszugeben, scheint es einen Unterschied zu geben, was es bei der Verwendung des Microsoft C ++ - Compilers und gcc ausgibt. Verwenden Sie beispielsweise den folgenden trivialen Code:
Mit dem Microsoft Visual C ++ - Compiler bekomme ich
%Vor%während beim Kompilieren mit gcc (in diesem Fall auf dem Mac), bekomme ich
%Vor% Das zweite Beispiel ist nicht ideal, weil ich oft mehrere Klassen mit zB Init()
und Uninit()
-Methoden habe und es in einem Debug-Ausgabe-Trace praktisch unmöglich ist zu sagen, welcher dieser Namen als Klassenname aufgerufen wurde wird fehlen. Jetzt weiß ich, dass Sie die __PRETTY_FUNCTION__
anstelle von __FUNCTION__
verwenden können, um etwas wie
Das ist in Ordnung, aber es ist ein wenig zu ausführlich für das, was ich brauche und wird ein bisschen lang für Funktionen mit vielen Parametern.
Also meine Frage ist (endlich), gibt es eine Möglichkeit, die Ausgabe wie einfach Foo::Bar
mit gcc aussehen, wie im obigen Beispiel?
Wenn Sie es zum Tracen verwenden, können Sie immer typeid(T).name()
verwenden und nur bedingt pro Plattform kompilieren. Sicherlich nicht so praktisch wie das Makro, aber es könnte funktionieren.
Ähnelt dem Makro __CLASS__ in C ++
Der vom Standard genehmigte Funktionsname ist wie folgt definiert:
%Vor%Beispiel:
%Vor%Aber Ausgabe mit g ++:
%Vor%Das ist jedoch ein gültiges C ++ - Verhalten:
§ 8.4.1, 8: Die funktionsspezifische vordefinierte Variable
__func__
ist definiert als ob eine Definition der Formstatic const char __func__[] = "function-name ";
wurde bereitgestellt, wobei der Funktionsname eine implementierungsdefinierte Zeichenfolge ist. Es ist nicht spezifiziert, ob eine solche Variable eine andere Adresse hat als jedes andere Objekt im Programm
Das heißt, Sie dürfen seinem Wert nicht vertrauen. Wenn Sie nicht-portable Erweiterungen verwenden möchten, sehen Sie sich eine ähnliche Frage an: Was ist der Unterschied zwischen __PRETTY_FUNCTION__, __FUNCTION__, __func__? .
Tags und Links c++ gcc windows macos compiler-construction