Heim > Backend-Entwicklung > C++ > Wie kann ich std::type_info::name entschlüsseln, um den zugrunde liegenden Typ in C anzuzeigen?

Wie kann ich std::type_info::name entschlüsseln, um den zugrunde liegenden Typ in C anzuzeigen?

Barbara Streisand
Freigeben: 2024-12-10 11:38:11
Original
446 Leute haben es durchsucht

How can I demangle std::type_info::name to reveal the underlying type in C  ?

De-Mangler für std::type_info::name: Enthüllung des entmystifizierten Namens

Der von std::type_info entstellte Name bleibt rätselhaft Dies macht es schwierig, den zugrunde liegenden Typ zu verstehen. Die Suche nach einer Lösung, die dieses Rätsel entwirrt, hat zur Erforschung verschiedener Ansätze geführt.

Den entstellten Namen entwirren

Eine Lösung nutzt die leistungsstarken Funktionen und g ' von C 11 s libstdc-Bibliothek über die Funktion abi::__cxa_demangle. Diese Funktion dekodiert den entstellten Namen und gibt eine für Menschen lesbare Zeichenfolge zurück.

C 11-Implementierung

In der C 11-Implementierung ist die Demangle-Funktion im „Typ“ enthalten .hpp“-Headerdatei, und die eigentliche Entflechtungslogik befindet sich in „type.cpp“. Der folgende Codeausschnitt veranschaulicht:

#include "type.hpp"

std::string demangle(const char* name) {

    int status = -4; 
    std::unique_ptr<char, void(*)(void*)> res {
        abi::__cxa_demangle(name, NULL, NULL, &status),
        std::free
    };

    return (status==0) ? res.get() : name ;
}
Nach dem Login kopieren

C 98-kompatible Version

Für diejenigen, die C 11 nicht verwenden, bleibt eine Alternative verfügbar. Die C 98-kompatible Implementierung in „type.cpp“ verwendet eine andere Technik, um den Namen zu entschlüsseln:

#include "type.hpp"

struct handle {
    char* p;
    handle(char* ptr) : p(ptr) { }
    ~handle() { std::free(p); }
};

std::string demangle(const char* name) {

    int status = -4; 
    handle result( abi::__cxa_demangle(name, NULL, NULL, &status) );

    return (status==0) ? result.p : name ;
}
Nach dem Login kopieren

Verwendung und Überlegungen

Der entschlüsselte Name kann abgerufen werden Verwenden der Typfunktion, die einen Verweis auf den zu entschlüsselnden Typ akzeptiert. Der folgende Code demonstriert seine Verwendung:

#include "type.hpp"
struct Base { virtual ~Base() {} };
struct Derived : public Base { };

int main() {
    Base* ptr_base = new Derived();
    std::cout << "Type of ptr_base: " << type(ptr_base) << std::endl;
    std::cout << "Type of pointee: " << type(*ptr_base) << std::endl;
    delete ptr_base;
}
Nach dem Login kopieren

Fazit

Mit diesen Techniken können Entwickler jetzt die verborgenen Identitäten entstellter Typnamen aufdecken und so ein klareres Verständnis davon erlangen die an ihrem Code beteiligten Typen.

Das obige ist der detaillierte Inhalt vonWie kann ich std::type_info::name entschlüsseln, um den zugrunde liegenden Typ in C anzuzeigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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