Désactiver l'avertissement dans MSVC ++ 2010
J'ai le code suivant:
/** Stupidly copies unicode chars into normal chars. */
std::string wstring2string(__in const std::wstring& s)
{
std::string temp(s.length(), ' ');
#pragma warning(push)
#pragma warning(disable: 4244) //possible loss of data
std::copy(s.begin(), s.end(), temp.begin());
#pragma warning(pop)
return temp;
}
Mon compilateur encore me montre avertissement C4244:
1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(2144): warning C4244: '=': Konvertierung von 'const wchar_t' in 'char', möglicher Datenverlust
1> c:\program files\microsoft visual studio 10.0\vc\include\xutility(2165): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)".
(en anglais: "la Conversion de const wchar_t
à char
la perte possible de données, voir la référence à l'instanciation de la fonction compilée modèle ...").
Comment puis-je le désactiver?!
source d'informationauteur Felix Dombek
Vous devez vous connecter pour publier un commentaire.
Bien pour se débarrasser de cet avertissement, vous devez ajouter les
#pragma warning...
autour de votre fichier d'en-tête qui comprend la fonction. Dans votre cas c'est xutility. Ce qui est inclus par plusieurs autres fichiers. De sorte qu'il sera difficile à trouver. Mais vous pouvez essayer de cette façon.À côté de ce que je recommanderais à une conversion correcte. Jetez un oeil à Soins intensifspar exemple, ou au moins utiliser la fonction de la norme. E. g. mbstowcs
Quand je veux le faire, je viens de mettre un #pragma warning( désactiver, 2422 ) en haut de la délinquance .fichier cpp, après les #include. Mais si j'étais vous, je voudrais essayer de résoudre l'avertissement plutôt que de les balayer sous le tapis. Jetant constness peut entraîner un comportement indéfini.
Pour résoudre le message d'avertissement, essayez quelque chose comme ceci (nous utilisons cette fonction dans notre solution):
Adapter à recevoir un const wstring&, il devrait être facile, étant donné que lorsque vous appelez c_str() pour un wstring(), vous obtenez un const wchar_t*
MODIFIER: Maintenant que je regarde cela de nouveau, elle peut être encore améliorée si vous utilisez RAII pour le tampon de variable locale. Juste au cas où.
MODIFIER: correction du code de considérer la taille des caractères
Essayez de changer votre fonction à quelque chose comme ceci (pas de compilateur C++ disponibles pour vérifier si il compile):
(Inspiré par dario_ramos réponse)
Que vous êtes sur Windows, vous pouvez même utiliser la fonction Windows API WideCharToMultiByte, ce qui fait fondamentalement la même, mais vous permet de spécifier la cible de codage.
L'avertissement n'est pas affiché uniquement si elle est désactivée avant, y compris la chaîne h-fichier. La réflexion sur la raison de ce comportement, je suppose que c'est un modèle spécifique de la question. Lors de la classe de modèle est inclus, le compilateur fait sorte de pré-compilation. Plein de compilation est effectuée uniquement lorsque le modèle est instancié. Il ressemble à VC++ compilateur conserve les paramètres d'avertissement de la pré-phase de compilation, et de les changer avant l'instanciation ne l'aide pas.