#pragma warning(disable:XXXX)的行为不符合预期(范围问题)

时间:2016-05-25 09:54:47

标签: c++ compiler-warnings suppress-warnings

考虑这个程序:

#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>

1 个答案:

答案 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。