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语句将不会捕获任何值,并且在你的交换机之后没有返回.
在您的交换机中添加默认情况,或添加一些错误处理代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |