考虑这个程序:
#include <string>
#include <boost/random.hpp>
int main(int argc, char *argv[])
{
return 0;
}
使用VS2015 Compilex,我从boost \ random \ detail \ polynomial.hpp文件中收到警告4996。
d:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility(2810): warning C4996: 'std::_Fill_n': 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'
d:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility(2797): note: voir la déclaration de 'std::_Fill_n'
d:\dev\vobs_ext_2015\libcpp\boost\1.60.0\boost\random\detail\polynomial.hpp(114): note: voir la référence à l'instanciation de la fonction modèle '_OutIt std::fill_n<boost::random::detail::polynomial_ops::digit_t*,size_t,boost::random::detail::polynomial_ops::digit_t>(_OutIt,_Diff,const _Ty &)' en cours de compilation
with
[
_OutIt=boost::random::detail::polynomial_ops::digit_t *,
_Diff=size_t,
_Ty=boost::random::detail::polynomial_ops::digit_t
]
所以我试图禁用警告:
#include <string>
#pragma warning(push)
#pragma warning( disable: 4996 ) // disable warning coming from boost/random.hpp
#include <boost/random.hpp>
#pragma warning(pop)
int main(int argc, char *argv[])
{
return 0;
}
警告仍在报告....然后我尝试了:
#pragma warning(push)
#pragma warning( disable: 4996 ) // disable warning coming from boost/random.hpp
#include <string>
#include <boost/random.hpp>
#pragma warning(pop)
int main(int argc, char *argv[])
{
return 0;
}
现在它已经消失了...为什么我需要在pragma push / pop指令中使用#include <string>
?
答案 0 :(得分:2)
警告来自内部头文件<xutility>
。此文件首先包含在<string>
中,然后也包含在<boost/random.hpp>
中(第二次可能会被忽略)。如果你想要抑制这个警告,你需要在第一次包含标题时对它进行抑制,但是你发现很难知道它是什么时候。
无论如何它有点奇怪的警告 - 它只是说这个调用可能是不安全的,但编译器不能说,而不是它实际上不安全。您可以像警告所说的那样使用项目设置中的_SCL_SECURE_NO_WARNINGS
定义(或者在包含任何标题之前或在您的pch中使用它时将其关闭)
按jpo38编辑:
这会删除警告:
#pragma warning(push)
#pragma warning( disable: 4996 ) // disable warning coming from boost/random.hpp
#include <boost/random.hpp>
#pragma warning(pop)
#include <string>
所以问题来自于<xutility>
和<boost/random.hpp>
都包含<string>
。由于<xutility>
它受到多个包含的保护(它有#pragma once
),因此首先要包含<xutility>
时必须禁用警告4996。