gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:48:31 24 4
gpt4 key购买 nike

当我以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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com