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

Nav*_*K N 17 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();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在我的ubuntu机器上用g ++ 打印P3foo.我不知道它为什么打印P3foo而不仅仅是foo.如果我改变代码就好

    std::cout << typeid(*this).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)

它打印3foo.

有什么想法吗?

Joh*_*itb 31

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

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

$ c++filt -t P3foo
foo*
Run Code Online (Sandbox Code Playgroud)

  • 在C++中没有办法做到这一点.然而,在GCC中,有一个由ABI公开的功能可以做到这一点.它位于cxxabi.h中,名为__cxa_demangle.只是传递它的名字.其接口遵循以下ABI:http://www.codesourcery.com/public/cxx-abi/abi.html#demangler (5认同)

Ili*_* K. 17

std::type_info::name()返回特定于实现的名称.AFAIK,虽然GCC 有一个,但没有可移植的方式获得"好"的名字.看看abi::__cxa_demangle().

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