c++ - GCC中enum switch的控制流不足分析

标签 c++ gcc gcc-warning control-flow

在下面的 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/

相关文章:

C++: 'Foo' 中成员 'f' 的错误请求,它是非类类型 'Foo*'

C++20 协程捕获与引用奇怪的崩溃与 `unique_ptr`

c++ - QT make 在构建时有大量输出

c - 警告 : '__builtin_snprintf' output may be truncated before the last format character [-Wformat-truncation=]

c - -W 标志,用于 gcc 检测获取未初始化变量的 const 指针

c++ - 我怎样才能打开(字面上)GCC的所有警告?

c++ - 处理STL容器的大小

c++ - 从 Linux 服务器复制文件

c++ - 我是否错误地使用了 fscanf?

c - ARM GCC 内联汇编