0

我正在查看使用依赖从 dll 导出的函数列表,我注意到名称中包含一些奇怪的符号。它们的格式为

??0Function Name@@QEAA@AEBV0@@Z

0也可能被其他数字代替。

@@ 的数量和字母不同。

谁能说出它们代表什么?

4

2 回答 2

1

这是由 C++ 编译器修饰的 C++ 标识符的名称。您可以从 Visual Studio 命令提示符运行 undname.exe 实用程序,将其转换回原始 C++ 声明:

C:\>undname ??0Foo@@QEAA@AEBV0@@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "??0Foo@@QEAA@AEBV0@@Z"
is :- "public: __cdecl Foo::Foo(class Foo const & __ptr64) __ptr64"

这使它成为 Foo 类的复制构造函数,编译为 64 位代码。我所知道的没有记录确切的装饰算法。通常,名称修饰用于避免链接器符号冲突,这是必要的,因为 C++ 支持重载。您可以通过使用来抑制装饰,extern "C"但这不适用于 C++ 类。

于 2012-04-11T13:02:22.767 回答
0

在某些情况下,您可能有兴趣使用 Microsoft 提供的 API 以编程方式取消装饰这些名称UnDecorateSymbolName

于 2012-05-10T21:16:49.550 回答