首頁 > 後端開發 > C++ > 主體

為什麼 GCC 的 `typeid.name()` 傳回損壞的名稱而不是普通型別名稱?

Mary-Kate Olsen
發布: 2024-11-22 11:50:12
原創
734 人瀏覽過

Why Does GCC's `typeid.name()` Return Mangled Names Instead of Plain Type Names?

GCC 的損壞類型名稱:揭秘'typeid.name()' 難題

使用'typeid.name()' 函數時使用GCC,用戶可能會對它返回的特殊字串感到驚訝。與其他提供未損壞的類別或結構名稱的編譯器不同,GCC 輸出一個充滿潛在困惑的修飾名稱。

深入研究問題

考慮以下C 程式碼:

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}
登入後複製

使用GCC 4.4.4 編譯此程式碼會產生令人困惑的結果結果:

4Blah
登入後複製

相較之下,Visual C 2008將會回傳:

struct Blah
登入後複製

揭開謎底

造成這種差異的原因在於「typeid.name()」的實現定義性質。實作可能會選擇為不同的類型傳回不同的字串,甚至為不同的類型傳回相同的字串。

GCC 的裝飾名稱

GCC 根據設計傳回一個裝飾名稱類型資訊。這個修飾名稱是一個複雜的字串,包含有關該類型的各種詳細信息,包括其名稱和關聯的模板參數。

拆解修飾名稱

為了理解 GCC修飾名稱,可以使用「c filt」指令或「__cxa_demangle」函式。這些工具可以對修飾名稱進行破壞,揭示底層未破壞的類別或結構名稱。

結論

雖然「typeid.name()」的行為可能有所不同跨編譯器,認識到其傳回的實作定義的性質至關重要。對於 GCC,它會傳回修飾名稱,這需要專門的工具來分解以提高可讀性。

以上是為什麼 GCC 的 `typeid.name()` 傳回損壞的名稱而不是普通型別名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板