【发布时间】:2011-04-01 11:10:50
【问题描述】:
我正在使用 boost::variant 并且在发布模式下编译时遇到问题。我在 VC2010 中工作,警告级别为 4,警告为错误。下面的代码在调试模式下编译良好,但在发布模式下,我在链接时收到一堆“无法访问的代码”C4702 警告(大概我在这里收到编译器警告,因为启用优化时会生成链接时代码。)
是否有人在这种情况下成功禁用了这些警告?如果可能的话,我宁愿保持高警告级别和警告作为错误。
#pragma warning( disable:4702 )
... 在这里似乎不起作用。下面是一些示例代码:
#include <boost/variant.hpp>
struct null{};
typedef boost::variant< null, double > variant_t;
class addition_visitor
: public boost::static_visitor< variant_t >
{
public:
template< typename T, typename U >
variant_t operator()( const T&, const U& ) const
{
throw( "Bad types" );
}
variant_t operator()( const double& left, const double& right ) const
{
return variant_t( left * right );
}
};
int main(int /*argc*/, char** /*argv*/)
{
variant_t a( 3.0 ), b( 2.0 );
variant_t c = boost::apply_visitor( addition_visitor(), a, b );
return 0;
}
警告是由模板化的 operator() 触发的,我用它来捕获试图将访问者应用于错误的变体类型的尝试。
【问题讨论】:
-
对警告级别 4 + 警告为错误点赞!
-
您是否尝试将编译指示放在文件顶部,在包含之前?而且@Matthieu 绝对会在漏洞出现之前将其杀死。
-
我尝试将编译指示放在文件顶部、类定义周围、apply_visitor 调用周围以及stdafx.h 的顶部。不幸的是,这些似乎都不起作用。
-
这很奇怪。我可以在没有
#pragma warning( disable:4702 )的情况下重现警告,但只要我把它放在那里(在第一个#include <boost/variant.hpp>之前的任何地方)它就会消失。除了 /W4 和 /WX 之外,您还使用任何其他非标准设置吗?我尝试了使用和不使用 LTCG,没有区别,只是有效。您是否安装了 SP1?因为我没有。 -
这个解决方案在 VS2010 中对我有用:stackoverflow.com/questions/12380603/…
标签: c++ visual-studio-2010 compiler-warnings suppress-warnings