2017-02-18 5 views
3

Может кто-нибудь помочь лучше понять вывод typeid.name() на картах и ​​векторах? Пожалуйста, найдите мою программу и ее результаты ниже.Понимание вывода typeid.name() для карт и векторов в C++

Например: выход для std::map<int,int> выходит TYPE is: [St3mapIiiSt4lessIiESaISt4pairIKiiEEE], где я могу расшифровать немного т.е. карте для std::map Ofcourse, Iii для int,int, но что же остальные символы означают?

Программа:

#include <iostream> 
#include <map> 
#include <vector> 
#include <typeinfo> 

using namespace std ; 

template <class A> 
void showtype (A x) 
{ 
     cout<<"TYPE is: ["<<typeid(x).name()<<"]\n" ; 
} 

int main() 
{ 
     std::map<int,int> iM ;     showtype(iM) ; 
     std::map<int,std::string> isM ;   showtype(isM) ; 
     std::map<std::string,std::string> ssM ; showtype(ssM) ; 
     std::vector<std::string> sV ;   showtype(sV) ; 
     std::vector<int> iV ;     showtype(iV) ; 
     return 0 ; 
} 

Выход:

%[email protected]> ./typeid.name 
TYPE is: [St3mapIiiSt4lessIiESaISt4pairIKiiEEE] 
TYPE is: [St3mapIiSsSt4lessIiESaISt4pairIKiSsEEE] 
TYPE is: [St3mapISsSsSt4lessISsESaISt4pairIKSsSsEEE] 
TYPE is: [St6vectorISsSaISsEE] 
TYPE is: [St6vectorIiSaIiEE] 
%[email protected]> 
+3

Команда Try-at-home: 'C++ filter <<<" _ZSt3mapIiiSt4lessIiESaISt4pairIKiiEEE "' –

+0

Спасибо Kerrek. Я могу видеть расширение остальных персонажей. – User9102d82

+0

Что такое «_Z»? это какой-то флаг? без него ничего не происходит. – User9102d82

ответ

4

Ваша платформа использует Itanium ABI, и, в частности, что Аби name mangling scheme. Подробные правила приведены в связанной спецификации.

Реализация вашей библиотеки решает вернуть (значительную часть) имя, искаженное от std::type_info::name. Это удачное совпадение, не требуемое Стандартом (на самом деле в Стандарте нет понятия связывания и манипуляции с именами).

В библиотеке ABI библиотеки GCC есть функция, позволяющая разворачивать имена в abi::__cxa_demangle (но не использовать их на ненадежном вводе, так как она полна уязвимостей!). Существует также автономный инструмент командной строки для демонтажа в Linux, c++filt, и Linux binutils (nm, objdump, readelf) также можетменовать имена. (По той же причине не запускайте их на ненадежном вводе.)

+0

Я проверяю предоставленную ссылку. Не могли бы вы подробнее рассказать о «ненадежном вводе»? Я действительно новичок в этой манящей штуковине. – User9102d82

+0

@UselessPerson: Просто эти алгоритмы не реализованы правильно этими библиотеками, поэтому я могу создать искаженное имя, которое берет на себя ваш компьютер и порождает корневую оболочку и т. Д. Вполне нормально использовать алгоритмы для имен *, сгенерированных вашим компилятором * , хоть. –

+0

О! хороший! это интересный материал. лол.. – User9102d82

Смежные вопросы