加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c 11 – gcc:切换后如何最好地处理关于(无法到达)功能结束的警

发布时间:2020-12-16 03:40:51 所属栏目:百科 来源:网络整理
导读:当我在c 11标准下编译以下代码时,它对于clang和 gcc都可以正常工作,但 gcc(我测试的所有版本4.8.2,4.9.2,5.1.0)都会发出警告: #include iostreamenum class FOO { A,B,C };const char * bar(FOO f) { switch (f) { case FOO::A: return "A"; case FOO::B: r
当我在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 with return 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?

我的信念是它可以用死代码消除它,但欢迎你证明我错了.

解决方法

does this mean that even at high optimization levels,gcc cannot dead-code eliminate the ‘end’ of the function?

是的,因为它不是死代码.

该标准允许您使用static_cast< FOO>(static_cast< int>(FOO :: B)| static_cast< int>(FOO :: C))作为参数调用您的函数.您的开关无法处理此问题.

您没有收到关于未在交换机中处理此事件的警告的原因是因为警告会产生太多误报.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读