2013-09-25 19 views
6

Tôi đang chạy một mã trên GCC C++ trình biên dịch, để sản xuất các type_info :: tên:C++ filt không demangle tên 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'; 
    } 

nhưng tôi nhận được kết quả như sau:

P6Circle 
P8triangle 

và trên demangling,

./shape | c++filt 

tôi nhận được đầu ra tương tự như trước đó. Bất kỳ giải pháp nào khác?

+0

[Tên mangling] (http://refspecs.linux-foundation.org/cxxabi-1.83.html#mangling) cho các loại không phức tạp, và chắc chắn không phải trong trường hợp đó ... Tôi không biết câu trả lời cho câu hỏi của bạn là, nhưng cách giải quyết khác là tự mình đọc loại. Con trỏ 'P' đến đối tượng hình tròn' 6Circle' (6 là chiều dài của tên) ... 'P' trỏ đến tam giác' 8triangle' (8 ký tự). –

+0

Hmm, điều đó thật đơn giản. Cảm ơn nhưng chỉ muốn biết nếu có một cách sạch hơn để nhận được cùng một –

Trả lời

10

Bạn cần phải sử dụng c++filt -t với nhiều loại nên sau đây nên làm việc:

./shape | c++filt -t 

các man page for c++filt nói sau đây cho -t:

Cố gắng để demangle loại cũng như tên hàm. Điều này bị tắt theo mặc định vì các kiểu bị xáo trộn thường chỉ được sử dụng trong trình biên dịch và chúng có thể bị nhầm lẫn với các tên không bị xáo trộn. Ví dụ, một hàm được gọi là "a" được coi là tên kiểu bị xáo trộn sẽ bị chuyển thành "char đã ký".

1

Phiên bản GCC nào (và tương ứng libstdC++) bạn đang sử dụng?

Với GCC 4.8, tôi có

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

và sau đó tôi có thể sử dụng

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

nơi ptr điểm đối với một số đối tượng với một RTTI (tức là với một số phương pháp ảo, đáng chú ý là một destructor ảo) .

+0

Đó là phiên bản GCC 4.6 –

+1

Sau đó, bạn nên nâng cấp lên GCC 4.8.1 vì 'typeid' được triển khai tốt hơn ở đó. –

+2

Xin chúc mừng, bạn vừa tạo ra hàng trăm người để thêm rò rỉ bộ nhớ vào ứng dụng của họ. Bạn phải deallocate bộ đệm trả về bởi 'abi :: __ cxa_dmangle' sau khi tạo chuỗi trả về. –

Các vấn đề liên quan