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
?
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
.
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
Existe-t-il un moyen de le faire simplement imprimer
Blah
oustruct 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.
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.
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.
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.