我已经使用了一些反混淆代码来协助调试,而不需要编写成千上万行的动态转换代码或实现返回类名的虚函数。
template <class CLASS>
std::string getClassName(CLASS &theObject)
{
int status = 0;
// Convert real name to readable string
char *realName = abi::__cxa_demangle(typeid(theObject).name(), nullptr,
nullptr, &status);
ASSERT(status == 0); // Assert for success
VERIFY(realName, return std::string());
// Return as string + prevent memory leaks!
const std::string result(realName);
free(realName);
return result;
}
这段代码的想法很简单,输出我们实际使用的类。 尽管在切换到Ubuntu 14.04之后,我无法再使用clang和c++-11/c++-14标准进行编译,所以我转而使用libc++而不是libstdc++。 切换到libc++后,我注意到当我解开'mangle' 'std::string'时,它不再输出'std::string',而是输出:
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >
当然,这是正确的,因为std :: string是std :: basic_string的typedef。 尽管我在libc ++和libstdc ++中都看到了相同的定义方式,但使用typedef定义。 因此,我真的不理解为什么通过切换到libc ++来更改此解缠。
有人知道为什么不同以及如何在CLASS为'std :: string'时获取'std :: string',而在CLASS为'myTemplate'时获取'myTemplate'吗?
提前感谢!
JVApen
std::basic_string
有一个特殊的名称重整,但是std::__1::basic_string
没有。您将需要使用一些后处理。 - Marc Glisse__1
命名空间中(我猜是为了支持版本控制,然后通过内联命名空间将该命名空间连接到std
)。由于它们使用的解码器是GCC的,因此该解码器不会考虑LLVM/Clang的命名约定。 - Manu343726