Lorsque vous travaillez avec des informations de type en C, typeid.name() est un outil pratique pour obtenir le le nom du type. Cependant, en utilisant GCC, les développeurs ont rencontré des caractères déroutants dans sa sortie. Cet article examine les raisons de ce comportement et explore comment obtenir des noms de types non mutilés.
Par défaut, GCC renvoie un « nom décoré » pour les types, qui inclut informations supplémentaires et n’est pas lisible par l’homme. Ceci est illustré dans l'extrait de code fourni :
#include <iostream> #include <typeinfo> struct Blah {}; int main() { cout << typeid(Blah).name() << endl; return 0; }
Lorsqu'il est compilé avec GCC, le code génère "4Blah" au lieu du "Blah" attendu. En effet, GCC a ajouté des informations liées au type au nom, telles que les paramètres et la taille.
Pour obtenir le nom non mutilé, nous devons appliquer un processus appelé « démêlage » ". GCC fournit la fonction __cxa_demangle() à cet effet, ainsi que l'outil de ligne de commande c filt.
Le code suivant montre comment démanteler le nom décoré :
#include <iostream> #include <typeinfo> int main() { const char* decorated_name = typeid(Blah).name(); char* unmangled_name = abi::__cxa_demangle(decorated_name, nullptr, nullptr, nullptr); // Windows: _ZNKSt7__cxxabiv117__class_type_info9can_catchEPv if (unmangled_name) { cout << unmangled_name << endl; free(unmangled_name); } else { cout << "Demangling failed" << endl; } return 0; }
Une fois compilé avec GCC, ce code affichera désormais "Blah", comme prévu.
Pendant que typeid.name() est un outil précieux pour obtenir des informations de type en C , il est crucial de comprendre comment GCC modifie les noms de types. En tirant parti des techniques de démêlage décrites ci-dessus, les développeurs peuvent extraire les noms de types lisibles par l'homme, simplifiant ainsi le débogage et l'analyse.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!