Heim > Backend-Entwicklung > C++ > Warum gibt „typeid.name()' von GCC unlesbare Namen zurück und wie kann ich das beheben?

Warum gibt „typeid.name()' von GCC unlesbare Namen zurück und wie kann ich das beheben?

Susan Sarandon
Freigeben: 2024-12-05 05:22:14
Original
119 Leute haben es durchsucht

Why Does GCC's `typeid.name()` Return Unreadable Names, and How Can I Fix It?

Besonderheiten von typeid.name() von GCC

Die Funktion typeid.name() wird oft verwendet, um Informationen über den Typ einer Variablen zu erhalten oder Ausdruck. Beim Kompilieren mit GCC wurde jedoch beobachtet, dass diese Funktion scheinbar unsinnige Zeichen anstelle des erwarteten entschlüsselten Typnamens zurückgibt. Dieses Verhalten steht im Gegensatz zu anderen Compilern wie Visual C, die eine klarere Darstellung bieten.

Der Grund für die Diskrepanz

Die Diskrepanz liegt in der Implementierung von typeid. name(), der durch die Implementierung des Compilers definiert wird. GCC gibt beispielsweise einen dekorierten Namen zurück, der zusätzliche Informationen über den Typ enthält, wie z. B. den Namen und die Signatur von Konstruktoren und Destruktoren.

Den dekorierten Namen entzerren

Um einen besser lesbaren Typnamen aus der dekorierten Zeichenfolge zu erhalten, können Sie Tools wie c filt oder __cxa_demangle verwenden. Diese Tools „entschlüsseln“ den dekorierten Namen, entfernen die zusätzlichen Informationen und hinterlassen den entschlüsselten Typnamen.

Beispiel: Entschlüsseln mit C-Filter

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << c++filt::demangle(typeid(Blah).name()) << endl;
  return 0;
}
Nach dem Login kopieren

Wann Wenn Sie diesen geänderten Code kompilieren und ausführen, erhalten Sie das gewünschte Ergebnis Ausgabe:

struct Blah
Nach dem Login kopieren

Fazit

Obwohl die Funktion typeid.name() von GCC anfänglich einen dekorierten Typnamen zurückgibt, ist es möglich, ihn zu entschlüsseln, um den entzerrten Typ zu erhalten Namen mithilfe von Tools wie C Filt oder __cxa_demangle. Wenn Sie die durch die Implementierung definierte Natur von typeid.name() verstehen, können Sie die gewünschten Typinformationen effektiv in Ihrem C-Code abrufen.

Das obige ist der detaillierte Inhalt vonWarum gibt „typeid.name()' von GCC unlesbare Namen zurück und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage