我正在查看使用依赖从 dll 导出的函数列表,我注意到名称中包含一些奇怪的符号。它们的格式为
??0Function Name@@QEAA@AEBV0@@Z
0也可能被其他数字代替。
@@ 的数量和字母不同。
谁能说出它们代表什么?
这是由 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++ 类。
在某些情况下,您可能有兴趣使用 Microsoft 提供的 API 以编程方式取消装饰这些名称UnDecorateSymbolName。