Windows下VS编译Boost 1.67.0出现Boost.Beast C4702不可达代码警告
解决VS编译Boost 1.67.0时verb_to_string函数的C4702不可达代码警告
我之前在VS上编译Boost 1.67的时候也碰到过这个恼人的C4702警告,来给你拆解下原因和靠谱的解决办法:
为啥会出这个警告?
VS的编译器对枚举类型的switch覆盖检查特别严格——哪怕你已经把verb枚举的所有case(包括unknown)都列出来了,它还是会钻牛角尖:万一有人把一个超出枚举范围的数值强制转换成verb类型传进来呢?这时候switch没匹配的case,理论上会走到函数末尾。但你的函数每个case都直接return了,所以这种非法路径实际上是不可达的,编译器就抛出了C4702警告。说白了,这就是VS编译器过度谨慎导致的误报。
怎么解决?
这里有几个可行的方案,你可以根据自己的情况选:
加个default分支(最推荐):在switch的最后补一个default case,明确处理非法情况,既能消警告,还能让代码更健壮。比如:
default: BOOST_ASSERT_MSG(false, "Invalid HTTP verb detected"); return "<invalid>";这样编译器就会认为所有路径都被覆盖了,不会再瞎报不可达代码,同时断言还能在调试阶段提醒你遇到了非法值。
临时禁用警告:如果不想动Boost的源码,或者确定不会有非法值传入,可以在包含相关头文件的地方临时把C4702警告关掉:
#pragma warning(push) #pragma warning(disable: 4702) #include <boost/beast/http/verb.hpp> #pragma warning(pop)注意用
push和pop把警告禁用的范围限制住,别不小心掩盖了其他地方真正的不可达代码问题。升级Boost版本:这个问题在Boost 1.68及以后的版本里已经被官方修复了,他们调整了
verb_to_string的实现逻辑,彻底消除了VS的这个警告。如果项目允许升级的话,直接更到最新稳定版是一劳永逸的办法。
内容的提问来源于stack exchange,提问作者badfd
相关产品推荐
相关产品推荐

