0

我正在使用相同的源重新编译 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,我没有这个区别。

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

4

1 回答 1

1

匿名命名空间仍然是唯一的。每个人都不一样。所以,在内部,他们仍然需要一个名字。

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

您将不得不停止依赖这些名称是确定性的。?A在比较匿名命名空间的修饰名称时,您可以注意then 忽略随后的十六进制数字。

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

于 2019-06-18T13:32:30.363 回答