c – GCC中枚举开关的控制流程分析不足

前端之家收集整理的这篇文章主要介绍了c – GCC中枚举开关的控制流程分析不足前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在以下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编译时发出警告,表示控制到达无效函数的结尾.为什么?

编辑

它通常不正确地说,示例中的变量测试可以包含任何值.

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不是有效的测试值(虽然它确实在纯C中有效,但不在C).

你确定可以明确地将一个任意的整数常量转换为枚举类型,但不是这个未定义的行为?

@H_404_19@解决方法
问题是,Test类型的变量可以具有编译器给出的类型允许的任何值.因此,如果它确定它是一个32位无符号整数,则允许该范围内的任何值.所以,如果你调用foo(123456),你的switch语句将不会捕获任何值,并且在你的交换机之后没有返回.

在您的交换机中添加默认情况,或添加一些错误处理代码.

猜你在找的C&C++相关文章