加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:29:10 所属栏目:百科 来源:网络整理
导读:在以下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编译时发出警告,表示控制到达无效函数的结尾.为什么? 编辑 它通常不正确地说,示例中的变量测试
在以下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).

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读