首頁 >後端開發 >C++ >為什麼 GCC 的 `typeid.name()` 會傳回奇怪的類型名稱,如何修復它?

為什麼 GCC 的 `typeid.name()` 會傳回奇怪的類型名稱,如何修復它?

DDD
DDD原創
2024-11-30 14:59:11440瀏覽

Why Does GCC's `typeid.name()` Return Weird Type Names, and How Can I Fix It?

使用typeid.name() 揭秘GCC 奇怪的類型名稱輸出

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

結論

雖然typeid.name() 是在C中獲取類型資訊的一個有價值的工具,但了解GCC如何處理類型名稱至關重要。

以上是為什麼 GCC 的 `typeid.name()` 會傳回奇怪的類型名稱,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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