在Visual Studio中生成的匿名名称空间变量的改写名称的数字部分意味着什么?

时间:2019-06-18 13:30:07

标签: c++ visual-studio name-mangling dumpbin

我正在使用相同的源代码重新编译C ++二进制文件。操作系统是Windows Server 2008 R2,编译器是Microsoft Visual Studio 2005。

此后,我运行dumpbin.exe /ALL /DISASM /RAWDATA:NONE并比较输出。 拆卸没有区别,但匿名名称空间中某些名称的处理方式却有区别。

例如,.cpp文件中的以下定义:

namespace {
    TCHAR l_pszSlashes[] = _T("\\/");
}

我可以有以下变化:

?l_pszSlashes@?A0x79ec3b0d@@3PA_WA (wchar_t * `anonymous namespace'::l_pszSlashes)
?l_pszSlashes@?A0xa9cc3791@@3PA_WA (wchar_t * `anonymous namespace'::l_pszSlashes)

仅当我比较新生成的dll和另一台计算机上的旧dll时,才会显示出差异。 如果我在同一台PC上编译该dll,则没有任何区别。

所以问题是: 改名中的这个十六进制数字部分是什么意思?为什么在某些情况下此十六进制数字部分不同?如何编译该项目以使它们具有相同的名称。

1 个答案:

答案 0 :(得分:1)

匿名名称空间仍然是唯一的。每个人都不一样。因此,在内部,他们仍然需要一个名称。

这似乎是一种自动生成一个大概是随机数(以十六进制表示)的方法。

您将不得不停止依赖这些名称具有确定性。在比较匿名名称空间的修饰名称时,您可以查找?A,然后忽略后续的十六进制数字。

但是,这可能会导致误报,这取决于您在做什么,因为这两个名称空间在字面上可能在原始源中的不同位置。没有真正的方法知道。