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
.
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
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
Nie. WynikCzy jest sposób, aby to po prostu wydrukować
Blah
albostruct Blah
?
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.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.
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.
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.
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