typeid () возвращает дополнительные символы в g ++ - PullRequest
17 голосов
/ 25 апреля 2009
class foo
{
public:
  void say_type_name()
  {
    std::cout << typeid(this).name() << std::endl;
  }
};

int main()
{
  foo f;;
  f.say_type_name();
}

Выше кода печатается P3foo на моей машине с Ubuntu с g ++. Я не понимаю, почему он печатает P3foo вместо просто foo . Если я изменю код как

    std::cout << typeid(*this).name() << std::endl;

печатает 3foo .

Есть мысли?

Ответы [ 3 ]

31 голосов
/ 25 апреля 2009

Потому что это указатель на foo. И у Фу 3 символа. Так становится P3foo. Другой имеет тип foo, поэтому он становится 3foo. Обратите внимание, что текст зависит от реализации, и в этом случае GCC просто дает вам внутреннее искаженное имя.

Введите это искаженное имя в программу c++filt, чтобы получить незафиксированное имя:

$ c++filt -t P3foo
foo*
17 голосов
/ 07 февраля 2010

std::type_info::name() возвращает специфичное для реализации имя. AFAIK, нет портативного способа получить «хорошее» имя, хотя GCC имеет одно . Посмотрите на abi::__cxa_demangle().

int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
0 голосов
/ 15 октября 2010

Есть ли портативное решение

Обходной путь может заключаться в том, чтобы сделать шаблон взломанным, чтобы все имена с зашифрованными типами возвращались как char*

какая платформа не имеет #include <cxxabi.h>?

...