【问题标题】:Can I enclose a switch block in a switch block?我可以在开关块中包含开关块吗?
【发布时间】:2014-06-25 10:45:58
【问题描述】:

我在一个 8051 项目上使用 Keil C,我收到错误 C175 - Duplicate Case value 来自以下内容:

switch (x) 
{
    case 0:
        break;
    case 1:
        break;
    case 2:
        switch (y) 
        {
            case 0:
                break;
            case 1:
                break;
        }
}

有什么想法吗?

【问题讨论】:

  • 为什么你总是breaking?这个奇怪的块的目的是什么?这仅仅是为了举例吗?
  • 尝试将内部switch 放在一个范围块中,即用{}s 包围它。
  • 实际上,为了简单起见,我已经把所有的代码都去掉了(显然)。我确实添加了:如果(某些测试){ Switch (y) { Case ...。 } 而且没有任何区别。

标签: c switch-statement keil


【解决方案1】:

你的编译器坏了。 Keil 因标准合规性差而臭名昭著。

C11 6.8.4.2/3

每个案例标签的表达式应为整数常量 表达式中没有两个 case 常量表达式 switch 语句在转换后应具有相同的值。也许有 在 switch 语句中最多是一个默认标签。 (任何封闭的 switch 语句可能有默认标签或大小写常量表达式 具有在封闭中重复大小写常量表达式的值 switch 语句。)

任何版本的 C 标准中都有上述粗体规范文本。

【讨论】:

    【解决方案2】:

    这可能是一个编译器错误。使用 gcc,您的代码可以完美运行:http://ideone.com/u4svzf。这是经过测试的代码:

    #include <stdio.h>
    
    int main(void) {
        int x, y;
        switch (x) {
        case 0:
            break;
        case 1:
            break;
        case 2:
            switch (y) {
                case 0:
                    break;
                case 1:
                    break;
            }
        }
        // your code goes here
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      您不能将“0”和“1”作为 case 语句放在另一个具有 0 和 1 的 switch 中。

      你可以找到解释here

      [EDİT]:实际上解释说“在同一语句中”,但我们从这里理解:在 keil C 中,我们不能将 switch 块包含在 switch 块中。就像@niklasfi 所说,它在 gcc 中完美运行(我也试过)。

      【讨论】:

      • 我编辑了答案,你可以看到niklasfi的答案是关于gcc,但问题是关于keil c。
      • 对不起,没有注意到那里的编译器
      猜你喜欢
      • 2021-10-05
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2016-05-21
      • 2011-03-04
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多