Почему typeid.name () возвращает странные символы, используя GCC, и как заставить его печатать не исправленные имена? - PullRequest
43 голосов
/ 17 декабря 2010

Как получается, когда я запускаю это main.cpp:

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}

Скомпилировав его с GCC версии 4.4.4:

g++ main.cpp

Я понял:

4Blah

В Visual C ++ 2008 я бы получил:

struct Blah

Есть ли способ заставить его просто напечатать Blah или struct Blah?

Ответы [ 6 ]

61 голосов
/ 17 декабря 2010

Возвращение name определяется реализацией: реализация даже не требуется возвращать разные строки для разных типов.

То, что вы получаете от g ++, это оформленное имя , которое вы можете "раскладывать" с помощью команды c++filt или __cxa_demangle.

17 голосов
/ 17 декабря 2010

Возвращаемая строка определяется реализацией.

Что делает gcc, так это возвращает искаженное имя.
Вы можете преобразовать искаженное имя в простой текст с помощью C ++ Filter

> a.out | c++filt
13 голосов
/ 17 декабря 2010

Есть ли способ заставить его просто напечатать

Blah или struct Blah?

Нет. Результат std::typeinfo::name() не указан. Он может даже вернуть одну и ту же строку для всех типов (или, в действительности, пустые строки для всех типов), и реализация все равно будет соответствовать стандарту. Вы не должны полагаться на его результат. Действительно, единственная вещь, для которой я нашел это полезным, была отладка.

Скажите нам, для чего вам это нужно. Часто черты характера - это то, что вы используете вместо этого.

7 голосов
/ 17 декабря 2010

Как уже говорили другие, результат здесь определяется реализацией , что означает, что реализация (т. Е. Цепочка инструментов компилятора) может свободно определять ее так, как она хочет, при условии, что она где-то документирует это.

Из стандарта C ++, раздел 18.5.1 / 1 [lib.type.info]:

Класс type_info описывает информацию о типах, созданную реализацией.Объекты этого класса эффективно хранят указатель на имя для типа и закодированное значение, подходящее для сравнения двух типов на равенство или порядок сортировки.Имена, правило кодирования и последовательность сортировки для типов не определены и могут отличаться в разных программах.

3 голосов
/ 17 декабря 2010

typeid().name() зависит от реализации. Он может даже вернуть пустую строку для каждого типа. Это не было бы очень полезной реализацией, но это было бы действительно.

2 голосов
/ 02 июня 2016

в 4Blah, 4 - количество букв в названии вашего класса. Например, если ваш класс называется myEmptyClass, он напечатает 12myEmptyClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...