Maison  >  Article  >  développement back-end  >  Pourquoi `typeid.name()` de GCC renvoie-t-il des noms mutilés au lieu de noms de types simples ?

Pourquoi `typeid.name()` de GCC renvoie-t-il des noms mutilés au lieu de noms de types simples ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-22 11:50:12737parcourir

Why Does GCC's `typeid.name()` Return Mangled Names Instead of Plain Type Names?

Noms de types mutilés de GCC : démystifier l'énigme 'typeid.name()'

Lors de l'utilisation de la fonction 'typeid.name()' avec GCC, les utilisateurs peuvent être surpris par les chaînes particulières qu'il renvoie. Contrairement à d'autres compilateurs qui fournissent des noms de classe ou de structure non mutilés, GCC génère un nom décoré plein de confusion potentielle.

Plonger dans le problème

Considérez le code C suivant :

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}

Compiler ce code avec GCC 4.4.4 rend perplexe résultat :

4Blah

En revanche, Visual C 2008 aurait renvoyé :

struct Blah

Dévoilement du mystère

La raison de cet écart réside dans la nature définie par l'implémentation de 'typeid.name()'. Une implémentation peut choisir de renvoyer des chaînes différentes pour des types distincts ou même des chaînes identiques pour des types différents.

Noms décorés de GCC

GCC, de par sa conception, renvoie un nom décoré pour tapez des informations. Ce nom décoré est une chaîne complexe qui englobe divers détails sur le type, y compris son nom et les arguments de modèle associés.

Démanteler le nom décoré

Pour donner un sens au nom décoré de GCC noms décorés, on peut utiliser la commande 'c filt' ou la fonction '__cxa_demangle'. Ces outils permettent de démanteler les noms décorés, révélant le nom de classe ou de structure non mutilé sous-jacent.

Conclusion

Bien que le comportement de 'typeid.name()' puisse varier entre les compilateurs, il est crucial de reconnaître la nature de son retour définie par l’implémentation. Dans le cas de GCC, il renvoie les noms décorés, qui nécessitent des outils spécialisés pour être démantelés pour plus de lisibilité.

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