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
Barbara StreisandOriginal
2024-12-10 11:38:11425Durchsuche

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 ;
}

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 ;
}

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;
}

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!

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