2013-09-25 26 views
6

をしない私は、GCC 出力にC++コンパイラ、TYPE_INFO上のコード::名前実行しています:C++ filtのデマングルのtypeid名

#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 

とデマングルに 、

./shape | c++filt 

は、私が以前と同じ出力を得ます。他の解決策?あなたは、次の動作するはずですので、タイプのためc++filt -tを使用する必要が

+0

[名前のマングリング](http://refspecs.linux-foundation.org/cxxabi-1.83.html#mangling)は種類が複雑ではなく、確かにそうではありません...私はあなたの質問に対する答えはありますが、回避策は自分でタイプを読むことです。 'P'' 6Circle'サークルオブジェクトへのポインタ(6は名前の長さです)' P'は '8triangle'三角形(8文字)へのポインタです。 –

+0

ええと、それは簡単です。ありがとうございます。同じものを入手するためのよりクリーンな方法があるかどうかを知りたいだけでした。 –

答えて

10

./shape | c++filt -t 

man page for c++filt-tために、次の言葉:タイプだけでなく、関数名をデマングルする

試みを。これは、デフォルトでは無効にされているため、マングルされた型は通常、コンパイラで内部的にのみ使用され、混乱していない名前と混同する可能性があります。例えば、 "a"と呼ばれる関数は、マングルされた型名として扱われ、 "signed char"にデマングルされます。

1

GCCのどのバージョン(対応するlibstdC++)を使用していますか? GCC 4.8で

、Iは

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; 

ここでいくつかのオブジェクトへptrRTTI(すなわち、いくつかの仮想メソッドと、特に仮想デストラクタ) 。

+0

GCCバージョン4.6 –

+1

GCC 4.8.1にアップグレードする必要があります。 –

+2

おめでとう、あなたはちょうど彼らのアプリにメモリリークを追加する何百人もの人々を誘いました。戻り文字列を作成した後、 'abi :: __ cxa_dmangle'によって返されたバッファの割り当てを解除する必要があります。 –

関連する問題