模块定义(.def)文件中的语法奇怪-“?”和“ @”

时间:2019-04-16 11:46:55

标签: c++

我正在查看程序的一些旧代码,尤其是“ exports.def”文件,并且有些地方我对那里使用的语法不太了解。

    ??0Hold@c4_ThreadLock@@QEAA@XZ
    ??0c4_Allocator@@QEAA@XZ
    ??0c4_BaseArray@@QEAA@XZ
    ??0c4_BlockedViewer@@QEAA@AEAVc4_Sequence@@@Z
    ??0c4_Bytes@@QEAA@AEBV0@@Z
    ??0c4_Bytes@@QEAA@PEBXH@Z
    ??0c4_Bytes@@QEAA@PEBXH_N@Z
    ??_R0?AVc4_FormatV@@@8   DATA
    ??_R0?AVc4_FormatX@@@8   DATA
    ??_R0?AVc4_GroupByViewer@@@8     DATA
    ??_R0?AVc4_Handler@@@8   DATA

导出的变量在一个或多个问号(有时为“ 0”)之后开始,文档未对此进行任何说明,我也不知道它们代表什么。对我来说,这里的“ @”也没有意义。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

您拥有的是a module-definition file

  

模块定义(.def)文件为链接器提供有关导出,属性以及有关要链接程序的其他信息的信息。

其中显示的是导出名称的列表,它们是mangled。名称中会添加一些字符,以实现名称的唯一性并存储其他信息。

专门针对Microsoft的Visual C ++系列编译器:

  

所有损坏的C ++名称都以?开头。 (问号)。由于所有乱码的C名称均以字母数字字符@(符号)和_(下划线)开头,因此C ++名称可以与C名称区分开。   整齐的名称的结构如下所示:

     

前缀?

     

可选:前缀@?

     

合格名称

     

类型信息

有关其他详细信息,请参见此link