【问题标题】:Can't declare variable in switch case [duplicate]无法在开关盒中声明变量[重复]
【发布时间】:2021-01-15 02:53:28
【问题描述】:
#include<stdio.h>

void main()
{
    int a = 4;
    switch (a)
    {
        case 4:
            int res = 1;
            printf("%d",res);
        break;

    }
}

当我用 gcc 编译这段代码时出现错误

root@ubuntu:/home/ubuntu# gcc test.c -o t
test.c: In function ‘main’:
test.c:9:4: error: a label can only be part of a statement and a declaration is not a statement
    int res = 1;

但是当我像case 4:; 这样添加; 时,我可以编译我的代码。

是什么问题以及为什么; 解决这个问题?

【问题讨论】:

    标签: c switch-statement label declaration


    【解决方案1】:

    与 C++ 相反,在 C 中声明不是语句,标签只能位于语句之前。

    在标签后放置一个空语句

    case 4:;
    

    你让标签现在不在声明之前。

    另一种方法是在标签之后使用复合语句,并将声明放在复合语句中,如

        case 4:
        {  
            int res = 1;
            printf("%d",res);
            break;
        }
    

    【讨论】:

    • 但是这个错误是正确的解决方法吗?这会给我带来麻烦吗?
    • @yokjc232 你显示的代码sn-p不会有问题。
    【解决方案2】:

    问题出在您的错误信息中:标签只能附加到语句上,而声明不是语句。

    看到N1570 6.8.2 复合语句,分别列举了declarationstatement,提示它们是不同的东西。

    Syntax
    1     compound-statement:
              { block-item-listopt }
    
          block-item-list:
              block-item
              block-item-list block-item
    
          block-item:
              declaration
              statement
    

    case 4:; 中的;空语句(在N1570 6.8.3 表达式和空语句中定义),是语句,因此是允许的。

    【讨论】:

    • 但是这个错误是正确的解决方法吗?这会给我带来麻烦吗?
    【解决方案3】:

    问题是什么,为什么;解决这个问题?

    问题正是错误消息所说的。您的 case 4: 是一个标签。标签标识紧随其后的语句,因此必须紧接在语句之前。 int res = 1; 等声明不是声明。

    另一方面,添加分号会创建一个空语句,顾名思义,它是一个语句,因此可以被标记。这就是它解决问题的原因。

    话虽如此,我认为分号解决方案的风格很差。我还认为声明一个其封闭块是 switch 的主体的变量是一种糟糕的风格,而且它也会以其他方式咬你。考虑将res 的声明移到switch 之外...

    int a = 4;
    int res = 1;
    switch (a) {
        case 4:
            printf("%d",res);
        break;
    }
    

    ... 或将其封闭在一个内部块中(这是一个复合语句,因此可以被标记)...

    int a = 4;
    switch (a) {
        case 4: {
            int res = 1;
            printf("%d",res);
            break;
        }
    }
    

    .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      相关资源
      最近更新 更多