这段代码中切换/默认的奇怪目的是什么?

时间:2010-06-29 14:05:34

标签: c++ c refactoring switch-statement

我正在将一些代码从C转移到C ++,我找到了这段代码:

if(ErrorCode >= SOME_CONSTANT)
{
    Status = RETVAL_OK;

    switch ( ErrorCode )
    {
        default:
            Status = RETVAL_FAILED;
            break;
    }
}

此代码生成编译警告:

warning C4065: switch statement contains 'default' but no 'case' labels

问题:switch语句是否有任何目的(我没有掌握)或者只是简单的代码?

也就是说,是否有任何理由(在编译ANSI C或C ++时)不这样写?

if(ErrorCode >= SOME_CONSTANT)
     Status = RETVAL_FAILED;

编辑:解决所有出现的问题:

代码并不是要扩展:这是四年前交付的模块的最终版本(从那时起它就没有被触及,所以我倾向于相信它是残酷的。)

就我所见,也没有删除的case语句(相同的代码构造放在代码中的三个不同的位置(如果检查错误常量,则在同一个switch/default内)。如果有的话删除案例陈述,当案件被删除时,代码应该已经被重构。

谢谢大家。

6 个答案:

答案 0 :(得分:9)

我能想到的两件事:1)代码是自动生成的2)原始编码器认为他们可能会在以后为错误代码添加不同的处理,但从未这样做过。 在任何一种情况下,我都看不出任何理由不将其改为简单的if语句

答案 1 :(得分:3)

也许代码是以某种方式生成的,并且生成器可能依赖于此语法来扩展它。但除此之外,我认为你不需要这么复杂的代码。

答案 2 :(得分:3)

我可以看到以这种方式编写它的唯一优势是,如果存在多个可能的错误代码,则通过添加case语句,该程序将更容易适应它。

在你的位置,我会问自己,在这个项目的未来,不同的错误代码有多大可能。如果可能的话,保留这个结构,否则抛弃它。

答案 3 :(得分:2)

这是Crufty代码。

答案 4 :(得分:2)

现有代码是冗余的,Status始终等于RETVAL_FAILED。看起来作者本来打算提供额外的逻辑,但由于某种原因还没有完成。

答案 5 :(得分:0)

如果ErrorCode是枚举,那么您可能想要检查枚举中的其他项并在switch语句中使用它们。

或者我认为原始程序包含另一个函数调用

ErrorCode = Func();

现在有一个

是有意义的
switch(ErrorCode)
{
case enum1:
break;
case enum2:
break;
default:
break;
}

当您必须在函数中执行多个任务并且返回值很常见时,会遵循这种方法。