Почему typeid.name() возвращает странные символы с помощью GCC и как заставить его печатать несвязанные имена?

Почему я запускаю этот 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 С++ 2008 я бы получил:

struct Blah

Есть ли способ сделать это просто печать Blah или struct Blah?

Ответ 1

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

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

Ответ 2

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

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

> a.out | c++filt

Ответ 3

Есть ли способ сделать это просто напечатать

Blah или struct Blah?

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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