C++ оператор typeid() из typeinfo не работает

Изображение пользователя Dexel.

Здравствуйте.
В кратце.
#include <typeinfo>
...
int i;
cout << typeid(i).name()
<< endl;
Выводит не тип, а название, т.е. `i`.
Для класса myclass выводит `7myclass`.

Полный код в спойлере:

Его компиляция:
g++ filename.cpp -o filename

Выводит:

Тип переменной i: i
Тип переменной f: f
Тип переменной ob: 7myclass

Инфа.
g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3

Linux dexel-desktop 3.8.0-31-generic #46-Ubuntu SMP Tue Sep 10 20:03:44 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Kubuntu 13.04 amd64

0
Dexel - 21 Сентябрь, 2013 - 21:02
Изображение пользователя Dexel.

То что нарыл, так то что этот typeid(type).name() платформозависимый.
У виндусятников так понимаю выдаёт тип, т.е. int для целочисленной, название класса для объекта класса (в книжке так).

Так мож этот g++ как раз и правильно компилит? Типа уникальное название что-ли?

0
Жюстина - 22 Сентябрь, 2013 - 01:51
Изображение пользователя Жюстина.

class myclass {
// ...
};

Пока тут не будет конкретики не будет и обоснования, вывод на оператор << можно сделать каким угодно, имя класса можно задавать напрямую кстати!!! Если имя не задано, то нет в стандарте обязательств каким образом его показывать.(не платформозависимый, а компиляторозависимый)

0
Dexel - 22 Сентябрь, 2013 - 11:20
Изображение пользователя Dexel.

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

Что-то примерно получается при запуске т.о.
$> execfile | c++filt -t
Вывод, той же программы:
Тип переменной int: int
Тип переменной float: float
Тип переменной ob: myclass

Сами типы то он вывел так как хотелось. Так остальное испоганил (стринги сами).

+2
Tonal - 24 Сентябрь, 2013 - 13:59
Изображение пользователя Tonal.

Стандарт С++ не описывает то, что будет возвращено typeid(...).name(). Это называется зависимым от реализации (implementation-defined) поведением.
Гарантируется только то, что для выражений с одинаковыми типами строки будут одинаковые. :)

В данном случае гнуь поступает вполне просто: отдаёт искаженные (mangled) имена типов.
Они вполне читаются глазом. :)
Ну а чтобы их раскодировать можно использовать гнусное расширение abi::__cxa_demangle.
см. g++ ext_demangling
typeid() returns extra characters in g++
Getting incorrect class name when using typeid

0
Dexel - 26 Сентябрь, 2013 - 22:59
Изображение пользователя Dexel.

Понял, спасибо.

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры