2013-09-25 67 views
6

我正在上GCC C++編譯器代碼,輸出TYPE_INFO ::名不還原函數typeid的名字:C++ filt的不

#include <iostream> 
#include <typeinfo> 

using namespace std; 

class shape { 
    protected: 
    int color; 
    public: 
    virtual void draw() = 0; 
    }; 


class Circle: public shape { 
    protected: 
    int color; 
    public: 
    Circle(int a = 0): color(a) {}; 
    void draw(); 
    }; 

    void Circle::draw() { 
    cout<<"color: "<<color<<'\n'; 
    } 

class triangle: public shape { 
    protected: 
    int color; 
    public: 
    triangle(int a = 0): color(a) {}; 
    void draw(); 
    }; 

    void triangle::draw() { 
    cout<<"color: "<<color<<'\n'; 
    } 

int main() { 
    Circle* a; 
    triangle* b; 
    cout<<typeid(a).name()<<'\n'; 
    cout<<typeid(b).name()<<'\n'; 
    } 

,但我得到的結果如下:

P6Circle 
P8triangle 

和demangling,

./shape | c++filt 

我得到了相同的輸出更早。其他解決方案?

+0

[Name mangling](http://refspecs.linux-foundation.org/cxxabi-1.83.html#mangling)對於類型來說並不那麼複雜,當然也不是這種情況......我不知道是什麼你的問題的答案是,但一個解決方法是自己讀取類型。指向'6Circle'圓對象的'P'指針(6是名字的長度)...指向'8triangle'三角形的'P'指針(8個字符)。 –

+0

嗯,那很簡單。謝謝,但只是想知道是否有一個更清晰的方式獲得相同的 –

回答

10

您需要使用c++filt -t的類型所以下面應該工作:

./shape | c++filt -t 

man page for c++filt說爲-t如下:

嘗試還原函數類型以及功能名稱。這是默認禁用的,因爲損壞的類型通常只在編譯器內部使用,並且可能會與非損壞的名稱混淆。例如,一個被稱爲「a」的函數被視爲一個損壞的類型名稱,將會被解壓縮爲「signed char」。

1

您使用的是哪個版本的GCC(及其相應的libstdC++)?

隨着GCC 4.8,我有

static inline std::string 
demangled_type_info_name(const std::type_info&ti) 
{ 
    int status = 0; 
    return abi::__cxa_demangle(ti.name(),0,0,&status); 
} 

,然後我可以使用

std::cout << demangled_type_info_name(typeid(*ptr)) << std::endl; 

其中ptr指向與某些對象的RTTI(即,具有一些虛擬方法,特別是一個虛擬的析構函數) 。

+0

它的GCC版本4.6 –

+1

然後,你應該升級到GCC 4.8.1,因爲'typeid'在那裏更好地實現。 –

+2

恭喜,您剛剛誘使數百人將內存泄漏添加到他們的應用中。創建返回字符串後,您必須釋放由'abi :: __ cxa_dmangle'返回的緩衝區。 –