Это - то, что мы используем. 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
Здесь, смотрите на type_strings.hpp, он содержит функцию, которая делает то, что Вы хотите.
, Если Вы просто ищете demangling инструмент, который Вы, например, могли использовать для искажения материала, показанного в файле журнала, смотрят на c++filt
, который идет с binutils. Это может demangle C++ и имена символа Java.
Не полное решение, но можно хотеть посмотреть на то, что часть стандарта (или широко поддерживаемый) определяет макрос. Распространено в регистрирующемся коде видеть использование макросов:
__FUNCTION__
__FILE__
__LINE__
e.g.:
log(__FILE__, __LINE__, __FUNCTION__, mymessage);
Это - определенная реализация, таким образом, это не что-то, что это будет портативным. В MSVC ++, имя () является неукрашенным именем, и необходимо посмотреть на raw_name () для получения украшенного.
Просто удар в темноте здесь, но под gcc, Вы могли бы хотеть посмотреть demangle.h
Я также нашел макрос названным __PRETTY_FUNCTION__
, который добивается цели. Это дает довольно имя функции (числа:)). Это - то, в чем я нуждался.
Т.е. это дает мне следующее:
virtual bool mutex::do_unlock()
, Но я не думаю, что это работает над другими компиляторами.
Смотрите на __cxa_demangle
, который можно найти в cxxabi.h
.
Я всегда хотел использовать type_info, но я уверен, что результат имени () функция членства нестандартна и не обязательно возвратит что-либо, что может быть преобразовано в значимый результат.
, Если Вы придерживаетесь одного компилятора, там возможно, компилятора определенная функция, которая сделает то, что Вы хотите. Проверьте документацию.
// KeithB's solution is good, but has one serious flaw in that unless buf is static
// it'll get trashed from the stack before it is returned in res - and will point who-knows-where
// Here's that problem fixed, but the code is still non-re-entrant and not thread-safe.
// Anyone care to improve it?
#include <cxxabi.h>
// todo: javadoc this properly
const char* demangle(const char* name)
{
static char buf[1024];
size_t size = sizeof(buf);
int status;
// todo:
char* res = abi::__cxa_demangle (name,
buf,
&size,
&status);
buf[sizeof(buf) - 1] = 0; // I'd hope __cxa_demangle does this when the name is huge, but just in case.
return res;
}