Mam proste C++ z Boost, jak poniżej:C++ Boost: co jest przyczyną tego ostrzeżenia?
#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(" "));
Działa to dobrze; zastępuje wszystkie wystąpienia(), z „”
Jednak uzyskać to ostrzeżenie podczas kompilacji:
Używam MSVC 2008, zwiększyć 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> ]
Mógłbym oczywiście wyłączyć ostrzeżenie używając
-D_SCL_SECURE_NO_WARNINGS
ale jestem trochę niechętny, aby to zrobić, zanim dowiem się, co się dzieje, albo co ważniejsze, czy mój kod jest nieprawidłowy.
To ostrzeżenie doprowadza mnie do szału, przypomina "ostrzeżenie" o zawartości gorącej kawy. – Clay
najgorsze jest to, że nie ma zdrowego "fix". Większość ostrzeżeń jest wydawanych, ponieważ istnieje lepszy, mniej podatny na błędy sposób osiągnięcia tego samego. Mogą być * naprawione *. Co masz z tym zrobić? Jeśli masz surową macierz C i musisz skopiować dane do lub z niej, wskaźniki są jedynym dostępnym typem iteratorów. std :: copy jest zdecydowanie najlepszą i najbezpieczniejszą opcją. A może sugerują, że wracamy do pisania na pętle, aby osiągnąć to samo? – jalf
Założę 100 powtórzeń, że zostanie usunięty w pierwszym SP wraz z drugim "nie testują tego, co zwalniają?" problemy ... –