Maison > développement back-end > C++ > Pourquoi `typeid.name()` de GCC renvoie-t-il des noms de types étranges et comment puis-je y remédier ?

Pourquoi `typeid.name()` de GCC renvoie-t-il des noms de types étranges et comment puis-je y remédier ?

DDD
Libérer: 2024-11-30 14:59:11
original
444 Les gens l'ont consulté

Why Does GCC's `typeid.name()` Return Weird Type Names, and How Can I Fix It?

Démystifier la sortie de nom de type étrange de GCC à l'aide de typeid.name()

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.

Le mystère des noms décoré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;
}
Copier après la connexion

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.

Démanglage des noms décorés

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;
}
Copier après la connexion

Une fois compilé avec GCC, ce code affichera désormais "Blah", comme prévu.

Conclusion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal