2013-09-25 23 views
6

ich einen Code auf GCC C++ Compiler zur Ausgabe läuft die type_info :: name:C++ filt nicht demangle typeid Name

#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'; 
    } 

aber ich habe folgende Ergebnisse:

P6Circle 
P8triangle 

und auf Demangling,

./shape | c++filt 

ich die gleiche Ausgabe wie früher. Irgendeine andere Lösung?

+0

[Name Mangling] (http://refspecs.linux-foundation.org/cxxabi-1.83.html#mangling) für Typen ist nicht so kompliziert, und sicherlich nicht in diesem Fall ... Ich weiß nicht was Die Antwort auf Ihre Frage ist, aber ein Workaround ist das Lesen des Typs selbst. 'P'-Zeiger auf' 6Circle' Kreis-Objekt (die 6 ist die Länge des Namens) ... 'P'-Zeiger auf' 8Dreieck'-Dreieck (8 Zeichen). –

+0

Hmm, das ist einfach. Danke, aber wollte nur wissen, ob es eine sauberere Möglichkeit gibt, das gleiche zu bekommen –

Antwort

10

Sie müssen c++filt -t für Typen verwenden, um die folgenden funktionieren sollte:

./shape | c++filt -t 

die man page for c++filt sagt der folgende für -t:

Versuch, Typen sowie Funktionsnamen demangle. Dies ist standardmäßig deaktiviert, da verstümmelte Typen normalerweise nur intern im Compiler verwendet werden, und sie können mit nicht verstümmelten Namen verwechselt werden. Zum Beispiel würde eine Funktion namens "a", die als Name eines Mangled-Typs behandelt wird, auf "Signed Char" ("signiertes Zeichen") zurückgesetzt.

1

Welche Version von GCC (und seinen entsprechenden libstdC++) verwenden Sie?

mit GCC 4.8, habe ich

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

und dann kann ich

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

wo ptr Punkte auf ein Objekt mit einer RTTI (dh mit einigen virtuellen Methoden, insbesondere eine virtuelle destructor) verwenden .

+0

Es ist GCC Version 4.6 –

+1

Dann sollten Sie auf GCC 4.8.1 aktualisieren, weil 'typeid' dort besser implementiert ist. –

+2

Herzlichen Glückwunsch, Sie haben gerade Hunderte von Leuten dazu gebracht, Speicherlecks in ihre Apps einzubauen. Sie müssen den Puffer, der von 'abi :: __ cxa_dmangle' zurückgegeben wird, nach dem Erstellen der Rückgabezeichenfolge freigeben. –