J'ai un simple C++ avec Boost comme ceci:
#include <boost/algorithm/string.hpp>
int main()
{
std::string latlonStr = "hello,ergr()()rg(rg)";
boost::find_format_all(latlonStr,boost::token_Finder(boost::is_any_of("(,)")),boost::const_formatter(" "));
Cela fonctionne bien. il remplace chaque occurrence de () par un ""
Cependant, je reçois cet avertissement lors de la compilation:
J'utilise MSVC 2008, Boost 1.37.0.
1>Compiling...
1>mainTest.cpp
1>c:\work\minescout-feat-000\extlib\boost\algorithm\string\detail\classification.hpp(102) : warning C4996: 'std::copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1> c:\program files (x86)\Microsoft visual studio 9.0\vc\include\xutility(2576) : see declaration of 'std::copy'
1> c:\work\minescout-feat-000\extlib\boost\algorithm\string\classification.hpp(206) : see reference to function template instantiation 'boost::algorithm::detail::is_any_ofF<CharT>::is_any_ofF<boost::iterator_range<IteratorT>>(const RangeT &)' being compiled
1> with
1> [
1> CharT=char,
1> IteratorT=const char *,
1> RangeT=boost::iterator_range<const char *>
1> ]
1> c:\work\minescout-feat-000\minescouttest\maintest.cpp(257) : see reference to function template instantiation 'boost::algorithm::detail::is_any_ofF<CharT> boost::algorithm::is_any_of<const char[4]>(RangeT (&))' being compiled
1> with
1> [
1> CharT=char,
1> RangeT=const char [4]
1> ]
Je pourrais certainement désactiver l'avertissement en utilisant
-D_SCL_SECURE_NO_WARNINGS
mais je suis un peu réticent à le faire avant de découvrir ce qui ne va pas, ou plus important encore si mon code est incorrect.
Il n'y a rien à craindre. Dans les dernières versions de MSVC, ils sont passés en mode sécurité complète paranoïa. std::copy
émet cet avertissement lorsqu'il est utilisé avec des pointeurs bruts, car utilisé incorrectement , il peut en résulter des dépassements de mémoire tampon.
Leur implémentation d'itérateur effectue une vérification des limites pour s'assurer que cela ne se produit pas, à un coût de performance significatif.
Alors n'hésitez pas à ignorer l'avertissement. Cela ne signifie pas qu'il y a quelque chose qui cloche dans votre code. Cela signifie simplement que si il y a quelque chose qui ne va pas dans votre code, alors de mauvaises choses vont arriver ... C'est une chose étrange de donner des avertissements. ;)
Vous pouvez également désactiver cet avertissement dans des en-têtes spécifiques:
#if defined(_MSC_VER) && _MSC_VER >= 1400
#pragma warning(Push)
#pragma warning(disable:4996)
#endif
/* your code */
#if defined(_MSC_VER) && _MSC_VER >= 1400
#pragma warning(pop)
#endif
Si vous vous sentez en sécurité pour désactiver cette erreur:
"-D_SCL_SECURE_NO_WARNINGS"
Cet avertissement provient des vérifications de bibliothèque "sûres" non standard de Visual Studio introduites à partir de MSVC 8.0. Microsoft a identifié des API "potentiellement dangereuses" et a injecté des avertissements décourageant leur utilisation. Bien qu'il soit techniquement possible d'appeler std :: copy de manière non sécurisée, 1) recevoir cet avertissement ne signifie pas que vous le faites, et 2) utiliser std :: copy comme vous le devriez normalement n'est pas dangereux.
Accédez aux propriétés de votre projet C++.
Développez le "C/C++"
Avancé: Désactiver les avertissements spécifiques: 4996
Sinon, si vous utilisez C++ 11 et que vous ne voulez pas désactiver les avertissements, vous avez la pénible option de remplacer
boost::is_any_of(L"(,)")
avec l'expression lambda suivante
[](wchar_t &c) { for (auto candidate : { L'(', L',', L')' }) { if (c == candidate) return true; }; return false; }
Vous pouvez aussi éventuellement mettre cela dans une macro