118 votes

Existe-t-il un démêleur de noms en ligne pour C++ ?

Je reçois une erreur de lien assez longue et confuse, et j'adorerais pouvoir la coller dans une zone de texte sur un site Web et que les noms soient démêlés pour moi.

Quelqu'un connaît-il un tel service ?

3 votes

Au fait, quel est votre compilateur ? Peut-être pouvez-vous simplement utiliser un outil prêt à l'emploi livré avec lui.

4 votes

J'ai trouvé "undname.exe" et il a fait le travail pour VC++.

3 votes

Collez votre nom ici, et si c'est un nom VC2005, je le démêlerai.

158voto

Rafael Baptista Points 516

J'ai créé un tel service en ligne : https://demangler.com

Il s'agit d'un démêleur de symboles gcc c++. Il suffit de copier une trace de pile, ou la sortie de nm dans une zone de texte, et il retournera la sortie avec les noms démêlés.

@Mise à jour : Il démêle maintenant les symboles MSVC et Java également.

0 votes

Celle-ci a fonctionné pour moi, mais pas celle de la réponse la plus populaire : _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE

0 votes

Votre démêleur ne peut pas démêler les qualificatifs réf pour Itanium. Je regarde _ZNR4test1fEv généré par Clang.

0 votes

Merci, beau site ! Pourriez-vous ajouter white-space: normal ou similaire à la balise <pre> de responseSection (et peut-être ajouter des numéros de ligne) ? La sortie longue d'une ligne n'est pas lisible actuellement.

110voto

nattofriends Points 981

C'est peut-être un peu tard, mais j'en ai créé un, basé sur cette question. Il fonctionne avec les entrées sur lesquelles j'ai essayé, supporte g++ et msvc++ via __cxa_demangle et __unDName, compilé en Javascript via Emscripten. J'espère que cela aidera quelqu'un : c++filtjs

Edit : Correction du problème d'échappement

7 votes

C'est génial ! Merci ! Vous pourriez peut-être mentionner "démêleur de noms C++ en ligne" quelque part sur la page, afin que les gens puissent vous trouver via Google ?

0 votes

Est-il possible d'étendre cet outil à d'autres systèmes d'exploitation ? Je suis particulièrement impatient de le porter pour AIX, Solaris et HPUX.

0 votes

Merci pour l'outil. Très joli et pratique. Une petite remarque est que l'outil ne gère pas correctement les templates. MyClass<int>::doStuff aura <int> caché.

34voto

Dummy00001 Points 6088

La plupart (si ce n'est tous) des compilateurs C++ sont livrés avec c++filt outil qui fait précisément ce que vous recherchez apparemment.

Si vous voulez le faire au clic de la souris... eh bien, écrivez une interface graphique pour cela ;)

0 votes

Je veux que cela se fasse avec un minimum d'effort plutôt qu'avec un clic de souris :) De toute façon, je n'en ai pas besoin très souvent.

4 votes

Mon cas habituel d'utilisation de c++filt est objdump -dr ./AClass.o | c++filt | less (désassembleur) ou nm ./AClass.o | c++filt | less (liste des symboles à l'intérieur du fichier objet)

4 votes

La plupart des compilateurs ne sont pas GCC. Les compilateurs qui ne sont pas GCC ne fournissent pas c++filt. Par induction, la plupart des compilateurs ne fournissent pas c++filt.

11voto

Shafik Yaghmour Points 42198

Il existe deux solutions de copier-coller en ligne :

Si vous n'avez besoin que du support pour GCC et Clang, vous avez aussi la possibilité d'utiliser Coliru qui est probablement le plus polyvalent compilateur C++ en ligne .

Ce n'est pas tout à fait aussi simple que de couper, coller et cliquer, mais ce n'est pas beaucoup plus difficile, et il semble qu'il n'y ait pas de problèmes avec les paramètres des modèles, comme indiqué ci-dessus. Vous devez simplement modifier la ligne de commande pour exécuter quelque chose comme ceci :

cat main.cpp | c++filt -t

Voyez-le en direct avec cet exemple qui démangent :

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

à :

void kernel<float, 3u>(float*, array<float const*, 3u>, array<float const*, 3u>, array<unsigned int, 3u>, array<unsigned int, 3u>, float)
           ^^^^^^^^^^^

2voto

zed_0xff Points 12379

Pour votre information, il existe également une gemme Ruby pour démêler les noms mélangés de Borland/MS/quelque chose : démêler

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X