[C++] RTTI(執行時期型態資訊)的 Demangling
挽救回不來的進度(?) 這些日子懶到只有發幾篇歌詞翻譯,連一點點的技術性文章都沒有產出,為了確認我還活著而且沒有轉職(??),想說發一篇不久前看到 C++ 裡一個好用的函式。 RTTI,執行期型態資訊 這個應該很多人都已經知道了,只要引入 <typeinfo> 標頭檔,再使用 typeid 運算子就可以得知目前某個變數的型態資訊,在多型與動態型別方面很有用。 而其中,有個 name() 成員函式可以取得型態的名稱,用法如下: #include <typeinfo> // 略... int i; cout << typeid(i).name() << endl; // 輸出: i 如果你是使用 gcc 的話就會看到輸出為單個字母:i,這不難理解,就是 int 嘛,但是這樣呢? char *c = new char; // 字元指標 int foo(float a); // 接受一個 float 並回傳 int 的函式 string s; // 字串 cout << typeid(c).name() << endl; cout << typeid(foo).name() << endl; cout << typeid(s).name() << endl; // 輸出: // Pc // FifE // NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE 第一個就是指向 char 的 Pointer 嘛,那接下來...「FifE」? 我是知道 Five 啦;「NSt7...... EEE」 ......?? 我彷彿看到了許多黑人問號。 會出現這麼奇怪的名字是因為 C++ 有一個叫做 Name Mangling 的機制,簡單說就是把型態名加入一些特色並改寫成一個不會與其它名字重複的技術,但是經過 mangle 的名字對我們人類來說實在不好理解啊!所以我們要介紹一個很好用的函式:abi::__cxa_demangle() Dema...