2010-06-03 7 views
0

J'ai le code ci-dessous que les liens et fonctionne très bien en mode 32 bits -VS2008 Lien Erreur L'utilisation SafeInt3.hpp en mode 64bit

#include "safeint3.hpp" 
typedef SafeInt<SIZE_T> SAFE_SIZE_T; 
SAFE_SIZE_T sizeOfCache; 
SAFE_SIZE_T _allocateAmt; 

Où safeint3.hpp est la version actuelle qui se trouve sur Codeplex SafeInt. Pour ceux qui ne le savent pas, safeint est une classe modèle qui rend le travail avec différents types et tailles d'entiers "sûrs". Pour citer la vidéo de canal 9 sur le logiciel - "il écrit le code que vous devriez".

Ce qui est mon cas. J'ai une classe qui gère un grand cache d'objets en mémoire (> 6gb) et je suis très soucieux de m'assurer que je n'ai pas de problèmes de débordement/débordement sur mes pointeurs/tailles/autres variables entières. Dans cette utilisation, il résout beaucoup de problèmes.

Mon problème vient quand on passe du mode de développement 32 bits au mode de production 64 bits. Lorsque je construis l'application dans ce mode, je reçois des avertissements de l'éditeur de liens suivants -

1>cachecontrol.obj : warning LNK4006: "bool __cdecl IntrinsicMultiplyUint64(unsigned __int64 const &,unsigned __int64 const &,unsigned __int64 *)" ([email protected]@[email protected]) already defined in ImageInRamCache.obj; second definition ignored 
1>cachecontrol.obj : warning LNK4006: "bool __cdecl IntrinsicMultiplyInt64(__int64 const &,__int64 const &,__int64 *)" ([email protected]@[email protected]) already defined in ImageInRamCache.obj; second definition ignored 

Même si je comprends que je peux ignorer l'erreur, je voudrais (a) empêcher l'avertissement de se produire ou (b) faites-le disparaître pour que mon département QA ne le signale pas comme un problème. Et après avoir passé du temps à faire des recherches, je ne peux pas trouver un moyen de le faire non plus.

Répondre

0

Le problème est qu'à l'intérieur safeint3.hpp, le code ressemble à ceci:

bool IntrinsicMultiplyUint64(const unsigned __int64& a, const unsigned __int64& b, unsigned __int64* pRet) 
{ 
    .... 
} 

Cela signifie que chaque traduction unité qui comprend safeint3.hpp obtiendra une définition de IntrinsicMultiplyUint64. Si vous êtes prêt à modifier ce fichier, vous pouvez faire en ligne les fonctions:

inline bool IntrinsicMultiplyUint64(const unsigned __int64& a, const unsigned __int64& b, unsigned __int64* pRet) 
{ 
    .... 
} 
+0

j'ajouté en ligne à la fois IntrinsicMultiplyUint64 (ligne 1643) et IntrinsicMultiplyInt64 (ligne 1651) et qui a résolu mon problème. Merci. En regardant le code, il n'est pas évident pourquoi parce que mon "intellesense" me dit que ces lignes ne sont pas compilées. Donc, je suis encore un peu confus, mais mon programme fonctionne maintenant, alors merci –

0

Ces fonctions sont-elles déclarées et définies dans le fichier d'en-tête et ne sont pas déclarées inline par hasard?

Il semble qu'ils soient quasi-alignés mais les symboles sont visibles en dehors du fichier objet, ce qu'ils ne devraient pas être.

Si c'est le cas, il suffit de les déclarer inline pour résoudre le problème.

0

En ce qui concerne votre question sur la désactivation de l'avertissement, cela devrait le faire:

#pragma warning(disable:4006)