首頁  >  文章  >  後端開發  >  為什麼 `typeid.name()` 在 GCC 中產生不同的輸出以及如何解析它?

為什麼 `typeid.name()` 在 GCC 中產生不同的輸出以及如何解析它?

Susan Sarandon
Susan Sarandon原創
2024-11-21 07:20:10330瀏覽

Why Does `typeid.name()` Produce Different Output in GCC and How Can I Demangle It?

GCC 中的Typeid.name() 行為與分解技術

使用typeid 運算子時,開發人員會遇到typeid 輸出的差異。 name() 取決於所使用的編譯器。本文探討了 GCC 中發生這種情況的原因以及如何解決列印未損壞的類型名稱的問題。

GCC 與Visual C :型別名稱顯示

在範例中假設,GCC(版本4.4.4)在呼叫typeid(Blah).name() 時傳回“4Blah”,而Visual C 2008 顯示“struct廢話。”這種差異是由於GCC 返回修飾類型名稱造成的。

GCC 的修飾型別名稱

typeid 運算子的實作並沒有統一定義。對於 GCC,它會傳回一個修飾類型名稱,其中包括類型的大小和對齊方式等附加資訊。

Unmangling Decorated Names

擷取未修飾的名稱輸入名稱,使用者必須對修飾名稱進行整理。這可以使用各種工具來完成:

  • c filt 指令: 分解修飾名稱的命令列公用程式。
  • __cxa_demangle() 函數: 執行的C 函數

應用分解

應用分解
g++ -fno-rtti -no-pie -o main main.cpp
./main | c++filt

在執行GC以下指令來分解修飾名稱「4Blah」:此指令將列印「struct Blah」作為分解後的型別名稱。將 __cxa_demangle() 函數整合到程式碼中也是一種以程式設計方式對修飾名稱進行分解的選項。

以上是為什麼 `typeid.name()` 在 GCC 中產生不同的輸出以及如何解析它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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