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