【发布时间】:2010-10-19 18:50:19
【问题描述】:
如何查看 C++ 中重载函数的编译器生成的重载名称?我正在使用 VC9,但也欢迎其他编译器的答案。
编辑:我在这里找到所有有用的答案。接受我最喜欢的那个。
【问题讨论】:
标签: c++ compiler-construction name-mangling visual-c++-2008
如何查看 C++ 中重载函数的编译器生成的重载名称?我正在使用 VC9,但也欢迎其他编译器的答案。
编辑:我在这里找到所有有用的答案。接受我最喜欢的那个。
【问题讨论】:
标签: c++ compiler-construction name-mangling visual-c++-2008
您可以使用Dependency Walker查看修饰的函数名称。
在依赖遍历器中打开任何 DLL\EXE,在右侧窗格中您可以看到修饰函数名称的列表。
【讨论】:
因为您还询问其他编译器。 gnu 工具链上有一个叫 nm 的工具。你会在 linux 和 cygwin 上得到它,我相信它也可以在 mingw 中使用。不带参数调用它会在二进制文件中显示损坏的符号。用 --demangle 调用它会很明显。
【讨论】:
您可以查看地图文件。假设您已打开地图文件生成。
【讨论】:
您可以使用Dumpbin 查看修饰(损坏)的名称。
【讨论】:
虽然上述所有方法都有效,但有一个很好的documented 方法可以使用Listing Files 查看损坏的名称:项目属性页 -> C/C++ -> 输出文件 -> 汇编程序输出。
(编辑:)
只有清单文件和DUMPBIN 被记录为查看修饰名称的方式是有原因的。建议作为解决方案的地图文件和依赖遍历器都显示 only 修饰名称。如果您有多个函数名称重载,您将很难将它们与您看到的各种修饰名称相匹配。 (这或多或少是在重构装饰方案。虽然possible,但它违背了整个最初的目的。)
【讨论】:
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
【讨论】: