在下面的 C++ 代码中:
typedef enum { a, b, c } Test;
int foo(Test test) {
switch (test) {
case a: return 0;
case b: return 1;
case c: return 0;
}
}
使用-Wall
编译时发出警告,表示控制到达非空函数的末尾。为什么?
编辑
说示例中的变量 test
可以包含任何值通常是不正确的。
foo(12354)
不编译:
> test.cpp:15:14: error: invalid conversion from ‘int’ to ‘Test’ > test.cpp:15:14: error: initializing argument 1 of ‘int foo(Test)’
因为 12354 不是有效的 Test
值(尽管它确实会在普通 C 中有效,但在 C++ 中不是) .
您确定可以将任意整数常量显式转换为枚举类型,但这不是未定义行为吗?
最佳答案
问题在于类型Test
的变量可以具有编译器赋予它的类型所允许的任何值。因此,如果它确定它是一个 32 位无符号整数,则该范围内的任何值都是允许的。因此,例如,如果您调用 foo(123456)
,您的 switch
语句将不会捕获任何值,并且在您的 之后没有
。return
切换
在你的 switch 中放置一个 default
case 或添加一些错误处理代码。
关于c++ - GCC中enum switch的控制流不足分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6376626/