首頁 >後端開發 >C++ >為什麼 GCC 的 `typeid.name()` 傳回不可讀的名稱,如何修復它?

為什麼 GCC 的 `typeid.name()` 傳回不可讀的名稱,如何修復它?

Susan Sarandon
Susan Sarandon原創
2024-12-05 05:22:14166瀏覽

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

GCC 的 typeid.name() 特性

typeid.name() 函數通常用於取得變數類型的資訊或表達。然而,當使用 GCC 編譯時,我們發現該函數會傳回看似無意義的字符,而不是預期的未損壞的類型名稱。此行為與 Visual C 等其他編譯器形成鮮明對比,後者提供了更清晰的表示。

差異背後的原因

差異在於 typeid 的實現。 name(),由編譯器的實作定義。例如,GCC 傳回裝飾名稱,其中包括有關類型的附加信息,例如構造函數和析構函數的名稱和簽名。

拆解裝飾名稱

要從修飾字串中取得更具可讀性的型別名稱,可以使用 c filt 或 __cxa_demangle 等工具。這些工具「分解」修飾名稱,刪除額外的資訊並留下未分解的類型名稱。

範例:使用 c filt分解

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << c++filt::demangle(typeid(Blah).name()) << endl;
  return 0;
}

何時你編譯並執行這個修改後的程式碼,你將得到想要的輸出:

struct Blah

結論

雖然GCC的typeid.name()函數最初傳回一個修飾的型別名稱,但可以對其進行分解以獲得未修飾的型別使用 c filt 或 __cxa_demangle 等工具命名。透過了解 typeid.name() 的實作定義性質,您可以有效地在 C 程式碼中檢索所需的類型資訊。

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

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