我目前正在编写一些日志记录代码,这些代码应该打印调用函数的相关信息。这应该是相对简单的,标准C++有一个type_info
类。它包含了typeid的类/函数等的名称,但是它被破坏了。它不是很有用。也就是说,typeid(std::vector<int>).name()
返回St6vectorIiSaIiEE
。
有没有一种方法可以从中产生一些有用的东西?就像上面例子中的std::vector<int>
。如果它只适用于非模板类,那也没问题。
这个解决方案应该适用于gcc,但如果我能移植它就更好了。它用于日志记录,所以它不是那么重要,所以它不能被关闭,但它应该对调试很有帮助。
发布于 2016-01-21 14:31:40
Boost核心包含一个解析器。检出core/demangle.hpp
#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
的一个包装器。
发布于 2008-11-11 19:21:40
这就是我们使用的。仅当可用时才设置HAVE_CXA_DEMANGLE (仅限最新版本的GCC )。
#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
发布于 2008-11-11 19:31:19
在这里,看看type_strings.hpp,它包含一个可以做你想做的事情的函数。
如果你只是想找一个去角工具,例如你可以用来破坏日志文件中显示的东西,那就看看c++filt
吧,它附带了binutils。它可以拆分C++和Java符号名称。
https://stackoverflow.com/questions/281818
复制相似问题