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

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

Susan Sarandon
Susan Sarandonoriginal
2024-12-05 05:22:14165parcourir

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

Particularités typeid.name() de GCC

La fonction typeid.name() est souvent utilisée pour obtenir des informations sur le type d'une variable ou une expression. Cependant, lors de la compilation avec GCC, il a été observé que cette fonction renvoie des caractères apparemment absurdes au lieu du nom de type non mutilé attendu. Ce comportement contraste avec d'autres compilateurs comme Visual C , qui fournissent une représentation plus claire.

La raison derrière l'écart

L'écart réside dans l'implémentation de typeid. name(), qui est défini par l'implémentation du compilateur. GCC, par exemple, renvoie un nom décoré, qui inclut des informations supplémentaires sur le type, telles que le nom et la signature des constructeurs et des destructeurs.

Démêlage du nom décoré

Pour obtenir un nom de type plus lisible à partir de la chaîne décorée, vous pouvez utiliser des outils tels que c filt ou __cxa_demangle. Ces outils "démanglent" le nom décoré, supprimant les informations supplémentaires et vous laissant avec le nom du type non mutilé.

Exemple : Démêlage avec c filt

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << c++filt::demangle(typeid(Blah).name()) << endl;
  return 0;
}

Quand vous compilez et exécutez ce code modifié, vous obtiendrez le résultat souhaité sortie :

struct Blah

Conclusion

Bien que la fonction typeid.name() de GCC renvoie initialement un nom de type décoré, il est possible de le démanteler pour obtenir le type non mutilé nom en utilisant des outils comme c filt ou __cxa_demangle. En comprenant la nature définie par l'implémentation de typeid.name(), vous pouvez récupérer efficacement les informations de type souhaitées dans votre code C.

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