在 Windows 上使用 Boost-1.67.0 和 VS 构建时,我在以下位置收到 C4702“无法访问”警告boost::beast::http::detail::verb_to_string(verb v)
:boost/beast/http/impl/verb.ipp
template<class = void>
inline string_view verb_to_string(verb v)
{
switch(v)
{
case verb::delete_: return "DELETE";
case verb::get: return "GET";
case verb::head: return "HEAD";
case verb::post: return "POST";
case verb::put: return "PUT";
case verb::connect: return "CONNECT";
o o o
case verb::unknown:
return "<unknown>";
}
BOOST_THROW_EXCEPTION(std::invalid_argument{"unknown verb"});
// Help some compilers which don't know the next line is
// unreachable, otherwise spurious warnings are generated.
return "<unknown>";
}
添加最后一个(底部)return "<unknown>";
是为了安抚那些不够聪明的编译器,他们不知道抛出的异常会阻止正常返回;但是,同一行代码对于(更智能的)Visual Studio 来说是有问题的,它将语句标记为不可访问(C4702)。在我的例子中,我们将编译器警告翻译成错误,所以这不仅仅是烦人的。
以下黑客从@DanielSeither 对Disable single warning error的回答中获得了一些灵感,并且似乎有效:
//
// Filename: boost_beast_http.hpp-no-c4702
//
// i.e. #include "boost_beast_http.hpp-no-c4702"
//
// Should appear before any other boost/beast header.
//
#if defined(OS_WIN32) || defined(OS_WIN64)
#ifndef BOOST_BEAST_HTTP_VERB_HPP
#define BOOST_BEAST_HTTP_IMPL_VERB_IPP
#include <boost/beast/http/verb.hpp>
#undef BOOST_BEAST_HTTP_IMPL_VERB_IPP
#pragma warning( push )
#pragma warning( disable : 4702 )
#include <boost/beast/http/impl/verb.ipp>
#pragma warning( pop )
#endif
#endif
#include <boost/beast/http.hpp>
但是没有修补 Microsoft VC++ 构建的源代码,有人可以提出更好的解决方法吗?