首頁 >後端開發 >C++ >如何分解 std::type_info::name 以揭示 C 中的基礎類型?

如何分解 std::type_info::name 以揭示 C 中的基礎類型?

Barbara Streisand
Barbara Streisand原創
2024-12-10 11:38:11405瀏覽

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

std::type_info::name 的De-Mangler:揭開神秘名稱

被std::type_info 破壞的名稱仍然是個謎,使得理解底層類型變得困難。為了尋求解開這個謎團的解決方案,人們探索了各種方法。

解開混亂的名稱

一個解利用了 C 11 的強大功能和 g '透過 abi::__cxa_demangle 函式開啟 libstdc 函式庫。此函數對損壞的名稱進行解碼,傳回人類可讀的字串。

C 11 實作

在C 11 實作中,demangle 函數包含在「型別.hpp」頭文件,實際的分解邏輯位於「type.cpp」中。以下程式碼片段說明:

#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 相容版本

對於那些不使用 C 11 的用戶,仍然可以使用替代方案。 「type.cpp」中的C 98 相容實作採用不同的技術來分解名稱:

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

使用和注意事項

可以檢索分解的名稱使用type 函數,函數接受要分解的類型的參考。以下程式碼示範了其用法:

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

結論

透過這些技術,開發人員現在可以揭開損壞類型名稱的隱藏身份,從而更清楚地隱藏身份,從而更清楚地隱藏身份了解代碼中涉及的類型。

以上是如何分解 std::type_info::name 以揭示 C 中的基礎類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn