在C ++中查看编译器管理的名称

时间:2009-04-16 05:38:51

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

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

修改:我发现这里的所有答案都很有用。接受我最喜欢的那个。

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:5)

您可以使用Dumpbin查看装饰(受损)名称。

答案 3 :(得分:5)

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

答案 4 :(得分:3)

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

(编辑:)

有一个原因只有列出文件和DUMPBIN被记录为查看装饰名称的方法。作为解决方案建议的地图文件和依赖性walker都显示装饰的名称。如果您有多个函数名重载,那么您很难将它们与您看到的各种装饰名称相匹配。 (这或多或少地重建了装饰方案。虽然possible,它却违背了整个原始目的。)

答案 5 :(得分:0)

linux gnu tool chain 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