当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《gcc:切换后如何最好地处理关于(无法到达)功能结束的警告?》经验,为你挑选了1个好方法。

当我在c ++ 11标准下编译以下代码时,它对于clang和gcc都可以正常工作,但gcc(我测试的所有版本4.8.2,4.9.2,5.1.0)都会发出警告:

#include 

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(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确实如此.

有没有一种很好的方法可以在这样的函数中本地抑制此警告,或者是抑制此警告的唯一方法一般是禁用警告?

编辑:我猜这个问题提出了一个自然语言律师的问题,从答案来看:

一致的编译器死代码可以消除bar我的列表中函数的"结束" 吗?(或101010的return nullptr;附加版本?)或符合标准是否要求它生成代码来处理不属于枚举定义的枚举值?

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



1> 小智..:

这是否意味着即使在高优化级别,gcc也不能死代码消除函数的"结束"?

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

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

你没有得到有关这在你的开关没有被处理预警的原因是因为该警告将有办法太多的误报.


即使`FOO`没有固定的底层类型,它也会被定义.*any*enum的范围,有或没有固定的底层类型,足以覆盖任何枚举值的按位OR.
推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有