Ich habe ein einfaches C++ mit Boost wie folgt:
#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(" "));
Das funktioniert gut; es ersetzt jedes Vorkommen von () durch ein ""
Diese Warnung erhalte ich jedoch beim Kompilieren:
Ich verwende 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> ]
Ich könnte die Warnung sicher mit deaktivieren
-D_SCL_SECURE_NO_WARNINGS
aber ich zögere ein bisschen, das zu tun, bevor ich herausfinde, was falsch ist, oder was noch wichtiger ist, wenn mein Code falsch ist.
Es ist nichts zu befürchten. In den letzten Versionen von MSVC haben sie sich in den Paranoia-Modus für vollständige Sicherheit versetzt. std::copy
gibt diese Warnung aus, wenn es mit unformatierten Zeigern verwendet wird, da bei falscher Verwendung zu Pufferüberläufen führen kann.
Ihre Iterator-Implementierung führt eine Begrenzungsprüfung durch, um sicherzustellen, dass dies nicht geschieht, und dies zu erheblichen Kosten.
Fühlen Sie sich frei, die Warnung zu ignorieren. Das bedeutet nicht, dass Ihr Code fehlerhaft ist. Es wird nur gesagt, dass wenn etwas mit Ihrem Code nicht stimmt, dann werden schlimme Dinge passieren. Was ist eine seltsame Sache, über die Sie gewarnt werden. ;)
Sie können diese Warnung auch in bestimmten Kopfzeilen deaktivieren:
#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
Wenn Sie sich bei der Deaktivierung dieses Fehlers sicher fühlen:
"-D_SCL_SECURE_NO_WARNINGS"
Die Warnung stammt von nicht standardmäßigen "sicheren" Bibliotheksüberprüfungen von Visual Studio, die ab MSVC 8.0 eingeführt wurden. Microsoft hat "potenziell gefährliche" APIs identifiziert und Warnungen eingefügt, die deren Verwendung abschrecken. Obwohl es technisch möglich ist, std :: copy auf eine unsichere Art und Weise aufzurufen, bedeutet 1), dass diese Warnung nicht angezeigt wird, und 2) die Verwendung von std :: copy, wie Sie es normalerweise tun sollten, nicht gefährlich ist.
Wechseln Sie zu den Eigenschaften Ihres C++ - Projekts
Erweitern Sie "C/C++"
Erweitert: Deaktivieren bestimmter Warnungen: 4996
Wenn Sie alternativ C++ 11 verwenden und Warnungen nicht deaktivieren möchten, haben Sie die schmerzhafte Option zum Ersetzen
boost::is_any_of(L"(,)")
mit dem folgenden Lambda-Ausdruck
[](wchar_t &c) { for (auto candidate : { L'(', L',', L')' }) { if (c == candidate) return true; }; return false; }
Sie können das möglicherweise auch in ein Makro packen