Maison >développement back-end >C++ >Pourquoi `typeid.name()` produit-il une sortie différente dans GCC et comment puis-je la démanteler ?

Pourquoi `typeid.name()` produit-il une sortie différente dans GCC et comment puis-je la démanteler ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-21 07:20:10383parcourir

Why Does `typeid.name()` Produce Different Output in GCC and How Can I Demangle It?

Comportement de Typeid.name() dans GCC et techniques de démantelage

Lors de l'utilisation de l'opérateur typeid, les développeurs rencontrent des différences dans la sortie de typeid. name() selon le compilateur utilisé. Cet article explique pourquoi cela se produit dans GCC et comment résoudre le problème d'impression des noms de types non mutilés.

GCC vs Visual C : affichage du nom de type

Dans l'exemple fourni, GCC (version 4.4.4) renvoie « 4Blah » lors de l'appel de typeid(Blah).name(), tandis que Visual C 2008 affiche « struct Blah ». Cet écart est dû au retour par GCC d'un nom de type décoré.

Les noms de types décorés de GCC

Les implémentations de l'opérateur typeid ne sont pas définies de manière uniforme. Dans le cas de GCC, il renvoie un nom de type décoré, qui inclut des informations supplémentaires telles que la taille et l'alignement du type. tapez le nom, les utilisateurs doivent démanteler le nom décoré. Cela peut être accompli à l'aide de divers outils :

Commande c filt :

Un utilitaire de ligne de commande qui démêle les noms décorés.

    Fonction __cxa_demangle() :
  • Une fonction C qui effectue le démêlage.
  • Application du démêlage
  • Dans GCC, la commande suivante peut être exécutée pour démanteler le nom décoré "4Blah" :

Cette commande affichera "struct Blah" comme nom du type démêlé. L'intégration de la fonction __cxa_demangle() dans votre code est également une option pour démanteler par programme les noms décorés.

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!

Déclaration:
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