c ++ filt不会解码typeid名称

时间:2013-09-25 13:04:07

标签: c++ typeid typeinfo demangler c++filt

我在GCC C ++ 编译器上运行代码,输出type_info :: 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';
   }

但我得到以下结果:

P6Circle
P8triangle

并且关于消防,

./shape | c++filt  

我得到的输出与之前相同。还有其他解决办法吗?

2 个答案:

答案 0 :(得分:10)

您需要对c++filt -t使用类型,因此以下内容应该有效:

./shape | c++filt -t

man page for c++filt-t说明了以下内容:

  

尝试解码类型和函数名称。默认情况下禁用此选项,因为损坏的类型通常仅在编译器内部使用,并且可能与非损坏的名称混淆。例如,一个被称为“a”的函数被视为一个受损的类型名称,将被解构为“signed char”。

答案 1 :(得分:1)

您使用的是哪个版本的GCC(及其相应的 libstdc ++ )?

GCC 4.8,我有

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;

其中ptr指向具有RTTI的某个对象(即使用某些虚拟方法,尤其是虚拟析构函数)。