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