crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как получить demangled представление объекта, Пример для MSVC и GCC
Andrew Selivanov
  опции профиля:
сообщение 18.12.2007, 16:53
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Описание проблемы
Итак, допустим мы хотим получить тип некоторого объекта, параметры и прочую информацию в runtime (например в целях отладки). Для этой цели можно использовать функцию typeid, но тут есть одна проблема - функция иногда возвращает тип объекта во внутреннем представлении конкретного компилятора (так называемое mangled представление http://en.wikipedia.org/wiki/Name_mangling).
Итак, если мы хотим получить представление функции в demangled виде:

Пример кода для компилятора GCC:
#include <iostream>
#include <typeinfo>
#include <cxxabi.h>

struct A
{
    int volatile member;
};

int volatile (A::*member_pointer) = &A::member;

int main(void)
{
    std::cout << typeid(member_pointer).name() << '\n';

    int rv;
    const char* mangled = typeid(member_pointer).name();
    const char* demangled = abi::__cxa_demangle(mangled, NULL, NULL, &rv);
    if (rv == 0)
    {
        std::cout << demangled << '\n';
    }
    else
    {
        std::cout << mangled << '\n';
    }
    return 0;
}

Результат работы:
M1AVi
int volatile A::*


Для MSVC результат работы typeid сразу будет представлен в demangled виде.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 23:59