Неискажение результата станд.:: type_info::имя:

85
задан Jeffrey Bosboom 31 October 2016 в 23:10
поделиться

8 ответов

Это - то, что мы используем. 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  
13
ответ дан KeithB 24 November 2019 в 08:18
поделиться

Здесь, смотрите на type_strings.hpp, он содержит функцию, которая делает то, что Вы хотите.

, Если Вы просто ищете demangling инструмент, который Вы, например, могли использовать для искажения материала, показанного в файле журнала, смотрят на c++filt, который идет с binutils. Это может demangle C++ и имена символа Java.

8
ответ дан Wolf 24 November 2019 в 08:18
поделиться

Не полное решение, но можно хотеть посмотреть на то, что часть стандарта (или широко поддерживаемый) определяет макрос. Распространено в регистрирующемся коде видеть использование макросов:

__FUNCTION__
__FILE__
__LINE__

e.g.:

log(__FILE__, __LINE__, __FUNCTION__, mymessage);
4
ответ дан luke 24 November 2019 в 08:18
поделиться

Это - определенная реализация, таким образом, это не что-то, что это будет портативным. В MSVC ++, имя () является неукрашенным именем, и необходимо посмотреть на raw_name () для получения украшенного.
Просто удар в темноте здесь, но под gcc, Вы могли бы хотеть посмотреть demangle.h

4
ответ дан Eclipse 24 November 2019 в 08:18
поделиться

Я также нашел макрос названным __PRETTY_FUNCTION__, который добивается цели. Это дает довольно имя функции (числа:)). Это - то, в чем я нуждался.

Т.е. это дает мне следующее:

virtual bool mutex::do_unlock()

, Но я не думаю, что это работает над другими компиляторами.

3
ответ дан terminus 24 November 2019 в 08:18
поделиться

Смотрите на __cxa_demangle, который можно найти в cxxabi.h.

1
ответ дан CesarB 24 November 2019 в 08:18
поделиться

Я всегда хотел использовать type_info, но я уверен, что результат имени () функция членства нестандартна и не обязательно возвратит что-либо, что может быть преобразовано в значимый результат.
, Если Вы придерживаетесь одного компилятора, там возможно, компилятора определенная функция, которая сделает то, что Вы хотите. Проверьте документацию.

0
ответ дан quamrana 24 November 2019 в 08:18
поделиться
// 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;
  }
1
ответ дан 24 November 2019 в 08:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: