Pourquoi ne typeid.nom() retournent des caractères bizarres à l'aide de GCC et comment le faire imprimer unmangled noms?
Comment se fait lorsque j'exécute ce main.cpp
:
#include <iostream>
#include <typeinfo>
using namespace std;
struct Blah {};
int main() {
cout << typeid(Blah).name() << endl;
return 0;
}
Par le compiler avec GCC version 4.4.4:
g++ main.cpp
J'obtiens ceci:
4Blah
Sur Visual C++ 2008, je voudrais obtenir:
struct Blah
Est-il un moyen de le faire, il suffit d'imprimer Blah
ou struct Blah
?
- double possible de d'Impression type de variable en C++
- Double Possible de Unmangling le résultat de std::type_info::name
Vous devez vous connecter pour publier un commentaire.
Le retour de
name
est mise en œuvre définies : une mise en œuvre n'est même pas nécessaire de retourner les différentes cordes de différents types.Ce que vous obtenez à partir de g++ est un nom décoré, que vous pouvez "demangle" à l'aide de la
c++filt
de commande ou__cxa_demangle
.c++filt -t
La chaîne renvoyée est définie par l'implémentation.
Ce que gcc est en train de faire est de retourner le nom décomposé.
Vous pouvez convertir le nom décomposé en texte brut avec c++filt
PFPFiiEiiE
, nous pouvons utiliser la commande shellecho "PFPFiiEiiE" | c++filt
, et le résultat seraitint (* (*)(int, int))(int)
.Pas. Le résultat de
std::typeinfo::name()
est pas spécifié. Il pourrait même revenir sur la même chaîne pour tous les types (ou, en fait, les cordes à vide pour tous les types) et de la mise en œuvre devrait toujours être la norme-conforme. Vous ne devez pas compter sur son résultat. Vraiment, la seule chose que j'ai trouvé utile pour le débogage.Dites-nous ce que vous en avez besoin pour. Souvent des traits est ce que vous utilisez à la place.
LOG("Blah");
. Mais je tiens à rendre compte de la possibilité de changer la struct nom dans l'avenir, donc je suis en train de faire:LOG(typeinfo(Blah).name();
blah
, vous avez une carte de chaînes à vecteurs de listes de chaînes. Qui peut très facilement dépasser des limites raisonnables pour la taille du fichier journal.Comme d'autres l'ont dit, le résultat est de mise en œuvre définies par, ce qui signifie que la mise en œuvre (c'est à dire, le compilateur de la chaîne d') est libre de définir la façon dont il veut, tant qu'il documents que quelque part.
De la norme C++, section 18.5.1/1 [lib.type.info]:
typeid().name()
est dépendant de l'implémentation. Il peut même renvoie la chaîne vide pour chaque type. Ce ne serait pas très utile, mais il serait valide.dans 4Blah, 4 est le nombre de lettres de votre nom de classe. Par exemple, si votre nom de la classe est myEmptyClass alors il serait impression 12myEmptyClass.