这是我的 C++11 实现,源自以下页面:
http: //gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html
#include <cxxabi.h> // needed for abi::__cxa_demangle
std::shared_ptr<char> cppDemangle(const char *abiName)
{
int status;
char *ret = abi::__cxa_demangle(abiName, 0, 0, &status);
/* NOTE: must free() the returned char when done with it! */
std::shared_ptr<char> retval;
retval.reset( (char *)ret, [](char *mem) { if (mem) free((void*)mem); } );
return retval;
}
为了使返回的 (char *) 上的内存管理变得容易,我使用了一个 std::shared_ptr 和一个自定义 lambda 'deleter' 函数,该函数在返回的内存上调用 free() 。因此,我不必担心自己删除内存,我只是根据需要使用它,当 shared_ptr 超出范围时,内存将被释放。
这是我用来以 (const char *) 形式访问解构类型名称的宏。请注意,您必须打开 RTTI 才能访问“typeid”
#define CLASS_NAME(somePointer) ((const char *) cppDemangle(typeid(*somePointer).name()).get() )
因此,在 C++ 类中,我可以说:
printf("I am inside of a %s\n",CLASS_NAME(this));