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

前端之家收集整理的这篇文章主要介绍了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.f2er.com/c/110723.html

猜你在找的C&C++相关文章