【问题标题】:How to undecorate name from decorated name?如何从装饰名称中取消装饰名称?
【发布时间】:2012-02-28 23:02:02
【问题描述】:

At a post of Raymond Chen,他似乎可以从修饰名中知道函数的未修饰名。我不知道他怎么会这样做。

在这个修饰的名字中,

?GetName@PushButton@UILibrary@@UAEPB_WPAPAVStringHolder@2@@Z

每个组件是什么意思?

【问题讨论】:

  • 查阅您的实现文档或使用 demangler 并学习最常见的模式。
  • 答案在博客中。 “我们询问未命名程序”。稍加训练,您就可以自己阅读这些名称,只需从您知道的来源生成一些修饰名称,但完整的规则很复杂(因为 c++ 类型系统很复杂),不值得发现和学习它们。
  • 这能回答你的问题吗? undecorate function names with visual studio sdk

标签: c++ windows visual-studio name-mangling


【解决方案1】:

为了避免猜测,并且仍然没有真正使用工具,UnDecorateSymbolName function 可能有用。希望能给出权威的正确答案。

要手动完成,this page 有一些关于该方案的信息,these 也有。

基本大纲是_name@scope@scope@@parameters@something@@something。我怀疑最后两部分是堆栈大小和调用约定或类似的,但文档可能有更多细节。

【讨论】:

  • +1 感谢您的链接。虽然比我预期的要复杂得多 -_-;
  • 最大的块(名称和包含范围)非常简单,只是以相反的顺序列出。显然前缀有很好的记录,我已经看到(但找不到)参数方案。
【解决方案2】:

名称修改取决于编译器。

在您链接的文章中,Raymond 正在使用 MS util(未命名)来消除损坏。

Here is a table 展示了常见的编译器是如何破坏的。

【讨论】:

  • 使用visual-studio 标签,问题也取决于编译器,这根本无助于回答。
  • 是的,我看到了,但我觉得他可以在最后一个简单的例子中自己解开这个名字。好吧,那不是没有办法轻易猜到吗?
  • @peachykeen:undname 是 Microsoft 工具,因此与 Visual Studio 紧密结合。我看不出这个答案有什么问题。
  • 有规则,比如?后跟成员函数的名称,@ 表示作用域,T、U、V 后跟联合、结构、类名,其他字母表示内置类型 - 如果您真的感兴趣,只需从你知道的声明,你很快就会学会使用的基本模式。
  • @Benjamin:有一个简单的猜测方法:经验。特定编译器的修饰是固定和定义的。经过一段时间查看已损坏和未损坏的名称后,您可以识别常见模式,而无需每次都查看文档。
【解决方案3】:

Microsoft Visual Studio 附带一个 undname.exe 工具。

http://msdn.microsoft.com/en-us/library/ms937379.aspx

如果您在默认位置有 MS VS,则可以使用:

"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\undname.exe" ?GetName@PushButton@UILibrary@@UAEPB_WPAPAVStringHolder@2@@Z

Microsoft (R) C++ Name Undecorator 版权所有 (C) 微软公司。保留所有权利。

取消装饰:-“?GetName@PushButton@UILibrary@@UAEPB_WPAPAVStringHolder@2@@Z”是:-“public: virtual wchar_t const * __thiscall UILibrary::PushButton::GetName(class UILibrary::StringHolder * *) "

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多