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

标签 c++11 gcc switch-statement language-lawyer compiler-warnings

当我以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))作为参数来调用函数。您的交换机无法处理此问题。

您未收到有关未在交换机中处理此问题的警告的原因是,该警告会产生太多误报。

关于c++11 - gcc:切换后如何最好地处理有关(无法到达的)功能结束的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34112483/

相关文章:

c - 如何加载 4 个无符号字符并使用 NEON 将它们转换为带符号的短裤?

c++ - 如何使 SFINAE 使用模板特化?

c++ - 静态类成员的初始化。为什么要构造函数?

c++ - C++ 程序的程序终止是可观察的行为吗?

c++ - 如何将 C++ 文件链接到 C 程序?

c - 在 C 中使用逻辑运算符切换大小写

c++: "invalid initialization of non-const reference of type ‘List&’ 来自类型为 ‘List*’ 的临时文件“

c - 有没有办法仅在运行二进制文件时从特定位置加载用户库

javascript - 使用 hammer.js 循环从第一个 if 跳到第二个

java - 在 Java 中创建 Switchable 类