Вот моя реализация на 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 с пользовательской лямбда-функцией 'delete', которая вызывает free () в возвращенной памяти.Из-за этого мне не нужно беспокоиться об удалении памяти самостоятельно, я просто использую ее по мере необходимости, и когда shared_ptr выходит из области видимости, память освобождается.
Вот макрос, который я использую для доступа к имени demangled type как (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));