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 ?
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!