2013-09-25 11 views
6

Używam kod w C++ GCC kompilatora, do wyprowadzania type_info :: nazwę:C++ filt nie demangle Imię 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'; 
    } 

ale uzyskać następujące wyniki:

P6Circle 
P8triangle 

i demangling,

./shape | c++filt 

uzyskać taki sam efekt, jak wcześniej. Jakieś inne rozwiązanie?

+0

[Name mangling] (http://refspecs.linux-foundation.org/cxxabi-1.83.html#mangling) dla typów nie jest aż tak skomplikowana, a na pewno nie w takim przypadku ... Nie wiem co odpowiedź na twoje pytanie jest, ale rozwiązaniem jest czytanie tego typu. 'P' wskaźnik do obiektu' 6Circle' Circle (6 to długość nazwy) ... 'Wskaźnik' P' do trójkąta '8triangle' (8 znaków). –

+0

Hmm, to jest proste. Dzięki, ale po prostu chciałem się dowiedzieć, czy istnieje czystszy sposób na uzyskanie tego samego –

Odpowiedz

10

Trzeba użyć c++filt -t dla typów więc następujące powinno działać:

./shape | c++filt -t 

man page for c++filt mówi po za -t:

Próba demangle typy jak nazwy funkcji. Jest to domyślnie wyłączone, ponieważ typy zniekształcone są zwykle używane tylko wewnętrznie w kompilatorze i można je pomylić z niezmytowanymi nazwami. Na przykład funkcja o nazwie "a" traktowana jako nazwa typu "zniekształcona" zostanie odszukana do "podpisanego znaku".

1

Która wersja GCC (i odpowiadająca jej libstdC++) używasz?

z gcc 4,8 mam

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); 
} 

a następnie można użyć

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

gdzie ptr wskazuje jakiegoś przedmiotu z AN RTTI (tj niektórych sposobach wirtualnych, zwłaszcza wirtualny destructor) .

+0

To jest GCC w wersji 4.6 –

+1

Następnie należy uaktualnić do GCC 4.8.1, ponieważ "typid" jest lepiej tam zaimplementowany. –

+2

Gratulacje, właśnie nakłoniliście setki ludzi do dodania przecieków pamięci do swoich aplikacji. Musisz zwolnić bufor zwrócony przez 'abi :: __ cxa_dmangle' po utworzeniu zwracanego ciągu. –

Powiązane problemy