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