我正在将 C++Builder 11 用于 64 位 VCL Windows 应用程序。我的程序使用名为 FlexCompress 的第 3 方组件,该组件在机器生成的标头
memcpy
文件中列出了名为 .hpp
的函数。
当我将 Indy 组件
TIdHTTP
(版本 10.6.2.0)添加到我的应用程序时,出现此错误:
[bcc64 Error] ws2tcpip.h(817): call to 'memcpy' is ambiguous
mem.h(58): candidate function
FXCZLib.hpp(150): candidate function
此文件位于文件
ws2tcpip.h(817)
中,错误下方列出了具有名为 memcpy
的函数的两个文件。
问题是我不相信我可以安全地修改这些头文件中的任何一个。有什么解决办法吗?
在文件中
ws2tcpip.h
:
if (Error == 0) {
if (*SourceCount > 0) {
CopyMemory(SourceList, Filter->imsf_slist,
*SourceCount * sizeof(*SourceList));
*SourceCount = Filter->imsf_numsrc;
}
*FilterMode = Filter->imsf_fmode;
}
在文件中
FXCZLib.hpp
:
extern DELPHI_PACKAGE void __cdecl memcpy(void * dest, void * Source, int Count);
在文件中
mem.h
:
void _FAR * _RTLENTRY _EXPFUNC memcpy(void _FAR *__dest, const void _FAR *__src, _SIZE_T __n);
我没有尝试任何东西,因为我害怕修改这些头文件。
问题不在于印地本身。
ws2tcpip.h
是一个标准的Microsoft头文件,它有一些调用CopyMemory()
的内联函数,它只是memcpy()
的别名。该错误是因为作用域中有多个来自不同来源的 memcpy()
声明,一个来自 C 运行时,一个来自 FlexCompress,并且编译器不知道使用哪一个。这与印地无关。 FlexCompress 一开始就不应该重新声明 memcpy()
。这是你应该与它的作者讨论的事情。
同时,您应该尝试重新排序您的头文件包含内容,以便 FlexCompress 的标头出现在 Indy 的标头之后。或者,尝试将 FlexCompress 和 Indy 分开,这样它们就不会在同一源单元中一起使用。