C ++ Boost:这个警告的原因是什么?
我有一个简单的C ++ Boost像这样:
#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(" "));
这工作正常; 它代替()的每一个出现,用“”
不过,编译时出现这个警告:
我正在使用MSVC 2008,升压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> ]
我当然可以使用禁用警告
-D_SCL_SECURE_NO_WARNINGS
但我有点不情愿这样做之前,我发现什么是错的,或者更重要的是如果我的代码是不正确的。
这是没有什么可担心的。 在MSVC的最后几个版本中,他们已经进入了完全的安全偏执狂模式。 std::copy
在与原指针一起使用时会发出此警告,因为如果使用不正确 ,可能会导致缓冲区溢出。
他们的迭代器实现执行边界检查,以确保这种情况不会发生,性能成本很高。
所以随时忽略警告。 这并不意味着你的代码有什么问题。 只是说如果你的代码出了问题,那么坏事情就会发生。 这是一个奇怪的事情发出警告。 ;)
您也可以在特定标头中禁用此警告:
#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
如果您对禁用此错误感到安全:
- 转到您的C ++项目的属性
- 展开“C / C ++”
- 突出显示“命令行”
- 在“其他选项”下,将以下内容添加到可能位于该框中的任何文本
“-D_SCL_SECURE_NO_WARNINGS”
警告来自Visual Studio的从MSVC 8.0开始引入的非标准“安全”库检查。 微软已经确定了“有潜在危险”的API,并注入了警告,劝阻他们使用。 虽然在技术上可以以不安全的方式调用std :: copy,但是1)接收到这个警告并不意味着你正在这样做,2)像平常一样使用std :: copy是不危险的。
-
转到您的C ++项目的属性
-
展开“C / C ++”
-
高级:禁用特定警告: 4996