Dlaczego typeid.name () zwracają dziwne znaki za pomocą GCC i jak sprawić, by drukowało niezaangażowane nazwy?

Jak to się stało, że prowadzę to main.cpp:

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

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

Kompilując go z GCC w wersji 4.4.4:

g++ main.cpp

Rozumiem to:

4Blah

NA Visual C++ 2008 dostałbym:

struct Blah

Czy jest jakiś sposób, aby to po prostu wydrukować Blah lub struct Blah?

6 answers

Zwraca {[0] } jest zdefiniowana implementacja : implementacja nie jest nawet wymagana do zwracania różnych łańcuchów dla różnych typów.

To, co otrzymujesz z g++ to dekorowana nazwa , którą możesz "demangle" używając c++filt polecenie lub __cxa_demangle.

 57
Author: icecrime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-16 22:18:11

Zwracany łańcuch jest zdefiniowany w implementacji.

Gcc zwraca zniekształconą nazwę.
Możesz przekonwertować zniekształconą nazwę na zwykły tekst za pomocą c++filt

> a.out | c++filt
 17
Author: Martin York,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-16 22:31:28

Czy jest sposób, aby to po prostu wydrukować

Blah albo struct Blah?

Nie. Wynik std::typeinfo::name() jest nieokreślony. Może nawet zwrócić ten sam ciąg dla wszystkich typów (lub, rzeczywiście, puste ciągi dla wszystkich typów) i implementacja nadal będzie zgodna ze standardem. Nie możesz polegać na jego wyniku. Naprawdę, jedyną rzeczą, którą uznałem za przydatną, było debugowanie. Powiedz nam, do czego ci to potrzebne. Często cechy są tym, czego używasz zamiast tego.
 12
Author: sbi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-16 22:17:38

Jak powiedzieli inni, rezultatem jest implementacja zdefiniowana , co oznacza, że implementacja (tj. zestaw narzędzi kompilatora) może dowolnie definiować ją tak, jak chce, o ile gdzieś to dokumentuje.

Ze standardu C++, sekcja 18.5.1 / 1 [lib.type.info]:

Klasa type_info opisuje informacje typu generowane przez implementację. Obiekty tej klasy skutecznie przechowuje wskaźnik do nazwy typu i zakodowaną wartość odpowiednią dla porównując dwa typy dla równość lub kolejność zestawiania. Nazwy, reguły kodowania i Sekwencja zestawiania typów są nieokreślone i mogą się różnić między programami.

 7
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-16 22:24:56

typeid().name() jest zależna od implementacji. Może nawet zwrócić pusty łańcuch dla każdego typu. To nie byłoby bardzo przydatne wdrożenie, ale byłoby ważne.

 3
Author: Juraj Blaho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-16 22:17:33

W 4Blah, 4 to liczba liter w nazwie twojej klasy. Na przykład, jeśli Twoja nazwa klasy to myEmptyClass, to wydrukuje 12myEmptyClass.

 2
Author: Pradeep Rohilla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-02 12:38:36