【问题标题】:View Compiler Mangled Names in C++在 C++ 中查看编译器错位名称
【发布时间】:2010-10-19 18:50:19
【问题描述】:

如何查看 C++ 中重载函数的编译器生成的重载名称?我正在使用 VC9,但也欢迎其他编译器的答案。

编辑:我在这里找到所有有用的答案。接受我最喜欢的那个。

【问题讨论】:

    标签: c++ compiler-construction name-mangling visual-c++-2008


    【解决方案1】:

    您可以使用Dependency Walker查看修饰的函数名称。

    在依赖遍历器中打开任何 DLL\EXE,在右侧窗格中您可以看到修饰函数名称的列表。

    【讨论】:

      【解决方案2】:

      因为您还询问其他编译器。 gnu 工具链上有一个叫 nm 的工具。你会在 linux 和 cygwin 上得到它,我相信它也可以在 mingw 中使用。不带参数调用它会在二进制文件中显示损坏的符号。用 --demangle 调用它会很明显。

      【讨论】:

        【解决方案3】:

        您可以查看地图文件。假设您已打开地图文件生成。

        【讨论】:

        • 如果同一个函数有多个重载怎么办?
        • 然后你会看到许多同名的函数被包装在不同的形式中,对于每个重载。
        • 那么您将看到该函数的多个版本,其中每个版本的名称形式都错位了。因此名称修改的目的是避免名称冲突。
        【解决方案4】:

        您可以使用Dumpbin 查看修饰(损坏)的名称。

        【讨论】:

          【解决方案5】:

          虽然上述所有方法都有效,但有一个很好的documented 方法可以使用Listing Files 查看损坏的名称:项目属性页 -> C/C++ -> 输出文件 -> 汇编程序输出。

          (编辑:)

          只有清单文件和DUMPBIN 被记录为查看修饰名称的方式是有原因的。建议作为解决方案的地图文件和依赖遍历器都显示 only 修饰名称。如果您有多个函数名称重载,您将很难将它们与您看到的各种修饰名称相匹配。 (这或多或少是在重构装饰方案。虽然possible,但它违背了整个最初的目的。)

          【讨论】:

            【解决方案6】:

            linux gnu 工具链 nm 命令可用于查看损坏的名称。

            #include<iostream> 
            using namespace std;
            
            int fun1(){}
            int fun1(int){}
            int main()
            {
            return 0;
            }
            
            #g++ name_decoration_2.cpp
            #nm a.out
            ...
            ...
            000000000040064e T _Z4fun1i
            0000000000400648 T _Z4fun1v
            U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
            U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
            

            【讨论】:

              猜你喜欢
              • 2016-03-14
              • 2010-10-02
              • 2021-03-17
              • 1970-01-01
              • 1970-01-01
              • 2015-03-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多