首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >解开std::type_info::name的结果

解开std::type_info::name的结果
EN

Stack Overflow用户
提问于 2008-11-11 18:52:31
回答 9查看 50.3K关注 0票数 116

我目前正在编写一些日志记录代码,这些代码应该打印调用函数的相关信息。这应该是相对简单的,标准C++有一个type_info类。它包含了typeid的类/函数等的名称,但是它被破坏了。它不是很有用。也就是说,typeid(std::vector<int>).name()返回St6vectorIiSaIiEE

有没有一种方法可以从中产生一些有用的东西?就像上面例子中的std::vector<int>。如果它只适用于非模板类,那也没问题。

这个解决方案应该适用于gcc,但如果我能移植它就更好了。它用于日志记录,所以它不是那么重要,所以它不能被关闭,但它应该对调试很有帮助。

EN

回答 9

Stack Overflow用户

发布于 2016-01-21 14:31:40

Boost核心包含一个解析器。检出core/demangle.hpp

代码语言:javascript
复制
#include <boost/core/demangle.hpp>
#include <typeinfo>
#include <iostream>

template<class T> struct X
{
};

int main()
{
    char const * name = typeid( X<int> ).name();

    std::cout << name << std::endl; // prints 1XIiE
    std::cout << boost::core::demangle( name ) << std::endl; // prints X<int>
}

正如前面提到的,它基本上只是abi::__cxa_demangle的一个包装器。

票数 34
EN

Stack Overflow用户

发布于 2008-11-11 19:21:40

这就是我们使用的。仅当可用时才设置HAVE_CXA_DEMANGLE (仅限最新版本的GCC )。

代码语言:javascript
复制
#ifdef HAVE_CXA_DEMANGLE
const char* demangle(const char* name)
{
   char buf[1024];
    unsigned int size=1024;
    int status;
    char* res = abi::__cxa_demangle (name,
                                 buf,
                                 &size,
                                 &status);
    return res;
  }
#else
const char* demangle(const char* name)
{
  return name;
}
#endif  
票数 11
EN

Stack Overflow用户

发布于 2008-11-11 19:31:19

在这里,看看type_strings.hpp,它包含一个可以做你想做的事情的函数。

如果你只是想找一个去角工具,例如你可以用来破坏日志文件中显示的东西,那就看看c++filt吧,它附带了binutils。它可以拆分C++和Java符号名称。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/281818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档