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

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

DDD
DDDOriginal
2024-11-30 14:59:11440Durchsuche

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

Entmystifizierung der seltsamen Typnamenausgabe von GCC mit typeid.name()

Bei der Arbeit mit Typinformationen in C ist typeid.name() ein praktisches Werkzeug, um die zu erhalten Name des Typs. Bei der Verwendung von GCC sind Entwickler jedoch auf verwirrende Zeichen in der Ausgabe gestoßen. Dieser Artikel befasst sich mit den Gründen für dieses Verhalten und untersucht, wie man entschlüsselte Typnamen erhält.

Das Geheimnis der dekorierten Namen

Standardmäßig gibt GCC einen „dekorierten Namen“ für Typen zurück, einschließlich zusätzliche Informationen und ist nicht für Menschen lesbar. Dies wird im bereitgestellten Codeausschnitt veranschaulicht:

#include <iostream>
#include <typeinfo>

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}

Beim Kompilieren mit GCC gibt der Code „4Blah“ anstelle des erwarteten „Blah“ aus. Dies liegt daran, dass GCC typbezogene Informationen an den Namen angehängt hat, wie z. B. Parameter und Größe.

Dekorierte Namen entwirren

Um den entwirrten Namen zu erhalten, müssen wir einen Prozess namens „Entwirrung“ anwenden ." GCC stellt zu diesem Zweck die Funktion __cxa_demangle() sowie das Befehlszeilentool c filt bereit.

Der folgende Code zeigt, wie der dekorierte Name entschlüsselt wird:

#include <iostream>
#include <typeinfo>

int main() {
  const char* decorated_name = typeid(Blah).name();
  char* unmangled_name = abi::__cxa_demangle(decorated_name, nullptr, nullptr, nullptr); // Windows: _ZNKSt7__cxxabiv117__class_type_info9can_catchEPv
  if (unmangled_name) {
    cout << unmangled_name << endl;
    free(unmangled_name);
  } else {
    cout << "Demangling failed" << endl;
  }  
  return 0;
}

Beim Kompilieren Mit GCC gibt dieser Code nun wie erwartet „Blah“ aus.

Fazit

Während typeid.name() ist ein wertvolles Werkzeug zum Abrufen von Typinformationen in C. Es ist wichtig zu verstehen, wie GCC Typnamen manipuliert. Durch die Nutzung der oben beschriebenen Entflechtungstechniken können Entwickler die für Menschen lesbaren Namen von Typen extrahieren und so das Debuggen und die Analyse vereinfachen.

Das obige ist der detaillierte Inhalt vonWarum gibt „typeid.name()' von GCC seltsame Typnamen zurück und wie kann ich das beheben?. 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