Wie imitiere ich die Microsoft-Version von __FUNCTION__ mit gcc?

8

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:

%Vor%

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

zu erhalten %Vor%

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?

    
binarybob 04.10.2011, 15:01
quelle

2 Antworten

3

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

    
Tom Kerr 04.10.2011, 15:10
quelle
2

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 Form static 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__? .

    
Sebastian Mach 04.10.2011 15:10
quelle