为什么我会收到 `warning: control reaches end of non-void function` with switch-case?
Why do I get `warning: control reaches end of non-void function` with switch-case?
考虑这样的代码:
enum class Foo
{
A, B
};
int deliverPizza(Foo foo)
{
switch (foo) {
case Foo::A:
return 0;
case Foo::B:
return 1;
}
}
int main()
{
return deliverPizza(Foo::A);
}
使用 $ g++ -o main main.cpp -Wreturn-type
编译:
main.cpp: In function ‘int deliverPizza(Foo)’:
main.cpp:14:1: warning: control reaches end of non-void function [-Wreturn-type]
这是为什么?据我所知,所有情况都在交换机内处理。是 GCC 不理解案例 return 吗?
另一方面,添加 default
会使 Clang
警告 Default label in switch which covers all enumeration values
。
当您通过强制转换表达式构造 enum
实例时,您仍然可以 运行 进入 UB。
return deliverPizza(static_cast<Foo>(42));
这是允许的并且可以愉快地编译。我想关于这种情况的警告是迂腐的。
考虑这样的代码:
enum class Foo
{
A, B
};
int deliverPizza(Foo foo)
{
switch (foo) {
case Foo::A:
return 0;
case Foo::B:
return 1;
}
}
int main()
{
return deliverPizza(Foo::A);
}
使用 $ g++ -o main main.cpp -Wreturn-type
编译:
main.cpp: In function ‘int deliverPizza(Foo)’:
main.cpp:14:1: warning: control reaches end of non-void function [-Wreturn-type]
这是为什么?据我所知,所有情况都在交换机内处理。是 GCC 不理解案例 return 吗?
另一方面,添加 default
会使 Clang
警告 Default label in switch which covers all enumeration values
。
当您通过强制转换表达式构造 enum
实例时,您仍然可以 运行 进入 UB。
return deliverPizza(static_cast<Foo>(42));
这是允许的并且可以愉快地编译。我想关于这种情况的警告是迂腐的。