微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

当我在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))作为参数调用您的函数.您的开关无法处理此问题.

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

原文地址:https://www.jb51.cc/c/110723.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐