web-dev-qa-db-fra.com

Pourquoi typeid.name () renvoie-t-il des caractères étranges en utilisant GCC et comment faire en sorte qu'il imprime des noms non mélangés?

Comment se fait-il que j'exécute ce main.cpp:

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

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

En le compilant avec GCC version 4.4.4:

g++ main.cpp

J'ai compris:

4Blah

Sur Visual C++ 2008, j'obtiendrais:

struct Blah

Existe-t-il un moyen de le faire simplement imprimer Blah ou struct Blah?

43
sivabudh

Le retour de name est défini par l'implémentation: une implémentation n'est même pas requise pour renvoyer différentes chaînes pour différents types.

Ce que vous obtenez de g ++ est un nom décoré , que vous pouvez "démêler" en utilisant le c++filt commande ou __cxa_demangle .

61
icecrime

La chaîne renvoyée est définie par l'implémentation.

Ce que fait gcc, c'est renvoyer le nom mutilé.
Vous pouvez convertir le nom modifié en texte brut avec c ++ filt

> a.out | c++filt
17
Martin York

Existe-t-il un moyen de le faire simplement imprimer

Blah ou struct Blah?

Non. Le résultat de std::typeinfo::name() n'est pas spécifié. Il pourrait même renvoyer la même chaîne pour tous les types (ou, en fait, des chaînes vides pour tous les types) et l'implémentation serait toujours conforme aux normes. Vous ne devez pas vous fier à son résultat. Vraiment, la seule chose pour laquelle je l'ai trouvé utile était le débogage.

Dites-nous pourquoi vous en avez besoin. Souvent, les traits sont ce que vous utilisez à la place.

13
sbi

Comme d'autres l'ont dit, le résultat ici est défini par l'implémentation, ce qui signifie que l'implémentation (c'est-à-dire la chaîne d'outils du compilateur) est libre de la définir comme elle le souhaite, tant qu'elle documente cela quelque part.

Du standard C++, section 18.5.1/1 [lib.type.info]:

La classe type_info décrit les informations de type générées par l'implémentation. Les objets de cette classe stockent efficacement un pointeur vers un nom pour le type et une valeur codée appropriée pour comparer deux types pour l'égalité ou l'ordre de classement. Les noms, la règle de codage et la séquence de classement des types ne sont pas tous spécifiés et peuvent différer d'un programme à l'autre.

7
Adam Rosenfield

typeid().name() dépend de l'implémentation. Il peut même renvoyer une chaîne vide pour chaque type. Ce ne serait pas une mise en œuvre très utile, mais ce serait valable.

3
Juraj Blaho

dans 4Blah, 4 est le nombre de lettres dans le nom de votre classe. Par exemple, si le nom de votre classe est myEmptyClass, il affichera 12myEmptyClass.

2
Pradeep Rohilla