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中文網其他相關文章!