我可以将开关块放在开关组中吗?

时间:2014-06-25 10:45:58

标签: c switch-statement keil

我在8051项目中使用Keil C并且我收到错误C175 - 以下重复案例值:

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

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你的编译器坏了。 Keil因其标准不合规而臭名昭着。

C11 6.8.4.2/3

  

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

以上粗体,规范性文本适用于C标准的任何版本。

答案 1 :(得分:1)

这可能是编译器错误。使用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;
}

答案 2 :(得分:0)

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

您可以找到解释here

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