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