在C 中處理類型資訊時,typeid.name() 是一個方便的工具來取得類型的名稱。然而,使用 GCC 時,開發人員在其輸出中遇到了令人困惑的字元。本文深入探討了這種行為背後的原因,並探討如何取得未損壞的類型名稱。
預設情況下,GCC 傳回類型的“裝飾名稱”,其中包括附加訊息,且不可讀。所提供的程式碼片段對此進行了舉例說明:
#include <iostream> #include <typeinfo> struct Blah {}; int main() { cout << typeid(Blah).name() << endl; return 0; }
使用 GCC 編譯時,程式碼輸出「4Blah」而不是預期的「Blah」。這是因為 GCC 在名稱中附加了與類型相關的信息,例如參數和大小。
要獲得未拆解的名稱,我們需要應用一個稱為「拆解」的過程」。GCC 為此提供了__cxa_demangle() 函數,以及命令列工具c filt。 demangle:
編譯時使用GCC,此程式碼現在將輸出“Blah”,如下所示#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; }
結論
以上是為什麼 GCC 的 `typeid.name()` 會傳回奇怪的類型名稱,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!