我正在将一些代码从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
内)。如果有的话删除案例陈述,当案件被删除时,代码应该已经被重构。
谢谢大家。
答案 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;
}
当您必须在函数中执行多个任务并且返回值很常见时,会遵循这种方法。