typeid()在g ++中返回额外的字符

时间:2009-04-25 17:53:31

标签: c++ g++ name-mangling typeid

class foo
{
public:
  void say_type_name()
  {
    std::cout << typeid(this).name() << std::endl;
  }
};

int main()
{
  foo f;;
  f.say_type_name();
}

上面的代码使用g ++在我的ubuntu机器上打印 P3foo 。我不明白它为什么打印 P3foo 而不仅仅是 foo 。如果我更改代码

    std::cout << typeid(*this).name() << std::endl;

打印 3foo

有什么想法吗?

3 个答案:

答案 0 :(得分:31)

因为它是指向foo的指针。 foo有3个字符。所以它变成了P3foo。另一个类型为foo,因此它变为3foo。请注意,文本是依赖于实现的,在这种情况下,GCC只会为您提供内部的错位名称。

将该受损名称输入程序c++filt以获取未编号的名称:

$ c++filt -t P3foo
foo*

答案 1 :(得分:17)

std::type_info::name()返回特定于实现的名称。 AFAIK,虽然GCC has one,但没有可移植的方式获得“好”的名字。请看abi::__cxa_demangle()

int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);

答案 2 :(得分:0)

  

是否有便携式解决方案

解决方法是制作模板hack以将所有已编码的类型名称返回为char*

哪个平台没有#include <cxxabi.h>