2010-03-04

gccの名前のデマングル

GCCのtype_infoのname()は、name manglingされたままの文字列を返す。読みにくいこと極まりない。

しかたがないので、Demanglingしてやることにする。

#include <cxxabi.h>

class Demangle
{
private :
    char * realname ;

public :
    Demangle( std::type_info const & ti )
    {
        int status = 0 ;
        realname = abi::__cxa_demangle( ti.name(), 0, 0, &status ) ;
    }

    Demangle( Demangle const & ) = delete ;
    Demangle & operator = ( Demangle const & ) = delete ;

    ~Demangle()
    {
        std::free( realname ) ;
    }

    operator char const * () const
    {
        return realname ;
    }

} ;

以下のように使う。

struct Foo {} ;

int f( float, int, Foo *, Foo &, Foo const volatile * (&) [10]  ) ;

template < typename ... Args >
struct Bar { } ;



int main()
{

    std::cout << Demangle(typeid(int)) << std::endl ;
    std::cout << Demangle(typeid(float)) << std::endl ;
    std::cout << Demangle(typeid(Foo)) << std::endl ;
    std::cout << Demangle(typeid(f)) << std::endl ;
    std::cout << Demangle(typeid(Bar<int, char, float, Foo, Bar<char, int, long> >)) << std::endl ;

}

出力結果

int
float
Foo
int ()(float, int, Foo*, Foo&, Foo const volatile* (&) [10])
Bar<int, char, float, Foo, Bar<char, int, long> >

Chapter 40. Demangling

とりあえず、Variadic Templatesについて、だいぶ理解した。やはり、実際に動くコンパイラで、書いて試すことができるというのは、ありがたい。

7 comments:

  1. おおーっ、こりゃええですな!

    ReplyDelete
  2. せやろ、せやろ。
    ていうかな、gccはんのtype_info::name()が、ハナッからdemanglingした結果を返したったらえーねん。
    なんでmanglingしたまま、よこすねん。アホちゃうか。

    ReplyDelete
  3. $ nm object.o | c++filt
    $ objdump -t object.o | c++filt
    とかのように、typeidをcoutに出した結果をc++filtにパイプしてやればよいと思います。

    ReplyDelete
  4. 別のDemangle変数に代入したらメモリリークですな

    ReplyDelete
  5. >別のDemangle変数に代入したらメモリリークですな
    修正

    ReplyDelete
  6. void operator=(Demangle const &) = delete; も追加で。

    ReplyDelete
  7. これはいいな
    知っておこう

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.