【问题标题】:"error: duplicate case value" error when using goto in switch statement在 switch 语句中使用 goto 时出现“错误:重复大小写值”错误
【发布时间】:2021-12-24 00:40:39
【问题描述】:

我试图使用goto 语句在不同的switch-cases 之间移动。我知道,最好不要使用goto,因为它会使程序难以理解,但我真的需要它。

这是我的代码的示例版本:

switch(something){
    case "c1":
        //some code
        break;
    case "c2":
       //some code
       break;
    case "c3":
        if(condition1)
            goto case "c1";
        if(condition2)
            goto case "c2";
    default:
        break;
}

现在,当我运行代码时,我收到以下错误 error: duplicate case value,它同时适用于 goto case "c1"goto case "c2"

我不确定为什么编译器会认为 switch-case 上的 goto 正在以相同条件在 switch 语句中重新定义另一个 case 并因此引发重复错误。对此错误的任何帮助和原因表示赞赏。

谢谢!

【问题讨论】:

  • 如果你想比较一个字符串,然后根据字符串做一些事情,使用类似std::map的东西,其中键是字符串,值是你可以的函数对象打电话并“做事”。

标签: c++ switch-statement label goto string-literals


【解决方案1】:

在任何情况下,switch 语句都没有意义,因为您使用字符串文字作为案例标签。

switch(something){
    case "c1":
        //some code
        break;
    case "c2":
       //some code
       break;
    case "c3":
        if(condition1)
            goto case "c1";
        if(condition2)
            goto case "c2";
    default:
        break;
}

switch 语句中的表达式转换为整数或枚举类型,不能隐式转换为指针或字符串字面量。

也许您需要使用字符文字,例如

case 'c1':

第二个问题是你不能在 goto 语句中使用 case 标签。您可以将 goto 语句仅与作为标识符显示的标签一起使用。 goto 语句的语法是

goto identifier ;

所以编译器认为 goto 语句中使用的 case 标签重新定义了已经引入的 case 标签。

【讨论】:

  • 我将字符串文字用作case,因为something 是每次都会更改的字符串中的一个字符。我确定我在某处说使用goto case "c1",无论如何,有没有替代方法?
  • @PranavDesai 正如我所写,你可能不会这样做。
  • 我大量假设了一些概念,因此错误反映在我的代码中。感谢您的澄清。
  • @PranavDesai 完全没有。不客气。:)
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多