当我在c ++ 11标准下编译以下代码时,它对于clang和gcc都可以正常工作,但gcc(我测试的所有版本4.8.2,4.9.2,5.1.0)都会发出警告:
#includeenum class FOO { A, B, C }; const char * bar(FOO f) { switch (f) { case FOO::A: return "A"; case FOO::B: return "B"; case FOO::C: return "C"; } } int main() { unsigned int x; std::cin >> x; FOO f = static_cast (x % 3); std::cout << bar(f) << std::endl; }
警告是-Wreturn-type
:
main.cpp: In function ‘const char* bar(FOO)’: main.cpp:14:1: error: control reaches end of non-void function [-Werror=return-type] } ^ cc1plus: all warnings being treated as errors
我仍然得到警告甚至-O2
还是-O3
优化-这是否意味着,即使在高优化级别,GCC不能死代码消除功能的"结束"?
值得注意的是,它没有给我关于未处理的开关案例的警告.
编辑:从使用Godbolt的实验看来,即使在高级别,它也不会消除死代码.我不确定它是否可以,或者如果clang确实如此.
有没有一种很好的方法可以在这样的函数中本地抑制此警告,或者是抑制此警告的唯一方法一般是禁用警告?
编辑:我猜这个问题提出了一个自然语言律师的问题,从答案来看:
一致的编译器死代码可以消除
bar
我的列表中函数的"结束" 吗?(或101010的return nullptr;
附加版本?)或符合标准是否要求它生成代码来处理不属于枚举定义的枚举值?
我的信念是它可以用死代码消除它,但欢迎你证明我错了.
这是否意味着即使在高优化级别,gcc也不能死代码消除函数的"结束"?
是的,因为它不是死代码.
该标准允许您将您的函数static_cast
作为参数调用.您的开关无法处理此问题.
你没有得到有关这在你的开关没有被处理预警的原因是因为该警告将有办法太多的误报.