Ответ 1
Возврат name
определяется реализацией: реализация даже не требуется для возврата разных строк для разных типов.
Что вы получаете от g++ - это украшенное имя, которое вы можете "развязать" с помощью c++filt
или __cxa_demangle
.
Почему я запускаю этот 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
?
Возврат name
определяется реализацией: реализация даже не требуется для возврата разных строк для разных типов.
Что вы получаете от g++ - это украшенное имя, которое вы можете "развязать" с помощью c++filt
или __cxa_demangle
.
Возвращаемая строка определяется реализацией.
Что gcc делает, это вернуть искаженное имя.
Вы можете преобразовать искомое имя в обычный текст с помощью С++ filt
> a.out | c++filt
Есть ли способ сделать это просто напечатать
Blah
илиstruct Blah
?
Нет. Результат std::typeinfo::name()
не указан. Он может даже возвращать одну и ту же строку для всех типов (или, действительно, пустые строки для всех типов), и реализация будет по-прежнему соответствовать стандарту. Вы не должны полагаться на его результат. Действительно, единственное, что мне показалось полезным, это отладка.
Расскажите, для чего вам это нужно. Часто черты - это то, что вы используете вместо этого.
Как говорили другие, результат здесь определяется реализацией, а это означает, что реализация (т.е. инструментальная цепочка компилятора) может свободно определять ее, как она хочет, до тех пор, пока она что-то документирует.
Из стандарта С++, раздел 18.5.1/1 [lib.type.info]:
Класс
type_info
описывает информацию о типе, сгенерированную реализацией. Объекты этого класса эффективно сохранить указатель на имя для типа и закодированное значение, подходящее для сравнения двух типов для равенства или порядка сортировки. Имена, правило кодирования и последовательность сортировки для типов не определены и могут различаться между программами.
typeid().name()
зависит от реализации. Он может даже возвращать пустую строку для каждого типа. Это была бы не очень полезная реализация, но это было бы правильно.
в 4Blah, 4 - количество букв в имени вашего класса. Например, если ваше имя класса является myEmptyClass, тогда оно будет печатать 12myEmptyClass.