当我在c 11标准下编译以下代码时,它对于clang和
gcc都可以正常工作,但
gcc(我测试的所有版本4.8.2,4.9.2,5.1.0)都会发出警告:
#include <iostream> enum 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<FOO>(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确实如此.
有没有一种很好的方法可以在这样的函数中本地抑制此警告,或者是抑制此警告的唯一方法一般是禁用警告?
编辑:我猜这个问题提出了一个自然语言律师的问题,从答案来看:
Can a conforming compiler dead-code eliminate the “end” of the
bar
function in my listing? (Or 101010’s version withreturn nullptr;
appended?) Or does conforming to the standard require that it generate code to handle enum values that aren’t part of the enum definition?
我的信念是它可以用死代码消除它,但欢迎你证明我错了.