Heim >Backend-Entwicklung >C++ >Warum erzeugt „typeid.name()' in GCC eine unterschiedliche Ausgabe und wie kann ich sie entzerren?

Warum erzeugt „typeid.name()' in GCC eine unterschiedliche Ausgabe und wie kann ich sie entzerren?

Susan Sarandon
Susan SarandonOriginal
2024-11-21 07:20:10386Durchsuche

Why Does `typeid.name()` Produce Different Output in GCC and How Can I Demangle It?

Typeid.name() Verhalten in GCC und Demangling-Techniken

Bei der Verwendung des Typeid-Operators stoßen Entwickler auf Unterschiede in der Ausgabe von Typeid. name() abhängig vom verwendeten Compiler. In diesem Artikel wird untersucht, warum dies in GCC auftritt und wie das Problem beim Drucken unverschlüsselter Typnamen behoben werden kann.

GCC vs. Visual C: Typnamenanzeige

Im Beispiel Vorausgesetzt, GCC (Version 4.4.4) gibt beim Aufruf von typeid(Blah).name() „4Blah“ zurück, während Visual C 2008 „struct Blah“ anzeigt. Diese Diskrepanz ist auf die Rückgabe eines dekorierten Typnamens durch GCC zurückzuführen.

Dekorierte Typnamen von GCC

Implementierungen des Typeid-Operators sind nicht einheitlich definiert. Im Fall von GCC wird ein dekorierter Typname zurückgegeben, der zusätzliche Informationen wie die Größe und Ausrichtung des Typs enthält.

Dekorierte Namen entzerren

Zum Abrufen der entzerrten Geben Sie einen Namen ein, Benutzer müssen den dekorierten Namen entwirren. Dies kann mit verschiedenen Tools erreicht werden:

  • c filt command: Ein Befehlszeilen-Dienstprogramm, das dekorierte Namen entschlüsselt.
  • __cxa_demangle()-Funktion : Eine C-Funktion, die ausgeführt wird Entflechtung.

Entflechtung anwenden

In GCC kann der folgende Befehl ausgeführt werden, um den dekorierten Namen „4Blah“ zu entflechten:

g++ -fno-rtti -no-pie -o main main.cpp
./main | c++filt

Dieser Befehl gibt „struct Blah“ als entzerrten Typnamen aus. Die Integration der Funktion __cxa_demangle() in Ihren Code ist auch eine Option zum programmgesteuerten Entwirren von dekorierten Namen.

Das obige ist der detaillierte Inhalt vonWarum erzeugt „typeid.name()' in GCC eine unterschiedliche Ausgabe und wie kann ich sie entzerren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn