在switch语句中使用goto跳转case时报duplicate case value错误如何解决
错误产生原因
- 该
duplicate case value报错的核心原因是你使用的编译语言不支持goto case 目标case值语法。goto case是C#独有的switch内部跳转语法,如果你用C、C++等其他类C语言的编译器编译这段代码,编译器无法识别goto case组合关键字,会把代码拆分为独立语义解析:先处理goto关键字,再把后续的case "c1"识别为新的case分支定义,和你前面已经声明过的case "c1"冲突,就会触发重复case值的报错。 - 额外说明:即便不考虑goto语法问题,C、C的switch语句本身就不支持字符串类型作为case判断值,仅支持整数、枚举、字符这类可转为整数的类型,如果你用C/C写这段代码,哪怕没有goto跳转逻辑,字符串形式的case标签本身也会触发编译错误。
替代实现方案
如果需要在C/C++中实现相同逻辑,可选择两种兼容写法:
- 抽离公共逻辑为独立函数,在需要跳转的位置直接调用
// 抽离各分支的公共处理逻辑 void handle_c1() { // 原c1分支的业务代码 } void handle_c2() { // 原c2分支的业务代码 } int main() { int something = 3; switch(something) { case 1: handle_c1(); break; case 2: handle_c2(); break; case 3: if(condition1) { handle_c1(); } else if(condition2) { handle_c2(); } break; default: break; } return 0; }
- 如果一定要用goto实现跳转,给对应分支打自定义标签即可:
int main() { int something = 3; switch(something) { case 1: label_c1: // 原c1分支的业务代码 break; case 2: label_c2: // 原c2分支的业务代码 break; case 3: if(condition1) { goto label_c1; } else if(condition2) { goto label_c2; } break; default: break; } return 0; }
内容的提问来源于stack exchange,提问作者Pranav Desai
相关产品推荐
相关产品推荐

