当我在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?
我的信念是它可以用死代码消除它,但欢迎你证明我错了.
解决方法
原文地址:https://www.jb51.cc/c/110723.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。