Ошибка канала VS2008 при использовании SafeInt3.hpp в 64-битном режиме - PullRequest
0 голосов
/ 03 июня 2010

У меня есть код ниже, который связывает и отлично работает в 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-го канала о программном обеспечении - «он пишет код, который должен».

Какой мой случай. У меня есть класс, который управляет большим кешем объектов в памяти (> 6 ГБ), и я очень обеспокоен тем, чтобы убедиться, что у меня нет проблем переполнения / недостаточного заполнения моих указателей / размеров / других целочисленных переменных. В этом случае он решает много проблем.

Моя проблема возникает при переходе из 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

Хотя я понимаю, что могу игнорировать ошибку, я бы хотел (а) предотвратить появление предупреждения или (б) заставить его исчезнуть, чтобы мой отдел контроля качества не пометил его как проблему. И потратив некоторое время на его изучение, я не могу найти способ сделать это.

Ответы [ 3 ]

0 голосов
/ 03 июня 2010

Относительно вашего вопроса об отключении предупреждения, это должно сделать это:

#pragma warning(disable:4006)
0 голосов
/ 03 июня 2010

Проблема в том, что внутри 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 )
{
    ....
}
0 голосов
/ 03 июня 2010

Эти функции объявлены и определены в заголовочном файле и случайно не объявлены как inline?

Похоже, что они квази-встроенные, но символы видны за пределами объектного файла, чего не должно быть.

Если это так, просто объявив их как inline, следует решить проблему.

...