我有以下代码链接并在32位模式下正常运行 -
#include "safeint3.hpp"
typedef SafeInt<SIZE_T> SAFE_SIZE_T;
SAFE_SIZE_T sizeOfCache;
SAFE_SIZE_T _allocateAmt;
其中safeint3.hpp是可在Codeplex SafeInt上找到的最新版本。对于那些不知道它的人来说,safeint是一个模板类,它使得处理不同的整数类型和大小“安全”。在软件上引用第9频道的视频 - “它会编写你应该编写的代码”。
这是我的情况。我有一个类管理一个大的内存中的对象缓存(> 6gb),我非常担心确保我的指针/大小/其他整数变量没有溢出/下溢问题。在这种用途中,它解决了许多问题。
从32位开发模式转移到64位生产模式时,问题就出现了。当我在这种模式下构建应用程序时,我收到以下链接器警告 -
1>cachecontrol.obj : warning LNK4006: "bool __cdecl IntrinsicMultiplyUint64(unsigned __int64 const &,unsigned __int64 const &,unsigned __int64 *)" (?IntrinsicMultiplyUint64@@YA_NAEB_K0PEA_K@Z) already defined in ImageInRamCache.obj; second definition ignored
1>cachecontrol.obj : warning LNK4006: "bool __cdecl IntrinsicMultiplyInt64(__int64 const &,__int64 const &,__int64 *)" (?IntrinsicMultiplyInt64@@YA_NAEB_J0PEA_J@Z) already defined in ImageInRamCache.obj; second definition ignored
虽然我明白我可以忽略错误,但我希望(a)防止警告发生或(b)使其消失,以便我的QA部门不会将其标记为问题。在花了一些时间研究之后,我找不到办法。
答案 0 :(得分:0)
这些函数是否在头文件中声明和定义,并且没有任何机会声明为inline
?
看起来它们是准内联的,但符号在目标文件外部是可见的,它们不应该是。
如果是这种情况,只需将其声明为inline
即可解决问题。
答案 1 :(得分:0)
关于禁用警告的问题,我们应该这样做:
#pragma warning(disable:4006)
答案 2 :(得分:0)
问题是在safeint3.hpp中,代码如下所示:
bool IntrinsicMultiplyUint64( const unsigned __int64& a, const unsigned __int64& b, unsigned __int64* pRet )
{
....
}
这意味着包含safeint3.hpp的每个翻译单元都将获得IntrinsicMultiplyUint64
的定义。如果您愿意修改该文件,可以将这些函数内联:
inline bool IntrinsicMultiplyUint64( const unsigned __int64& a, const unsigned __int64& b, unsigned __int64* pRet )
{
....
}