无法在switch case中声明变量。

8 浏览
0 Comments

无法在switch case中声明变量。

这个问题已经有了答案

为什么不能在 switch 语句中声明变量?

#include
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:; 这样添加一个 ;,就可以编译代码了。

这是什么问题,为什么 ; 可以解决它?

admin 更改状态以发布 2023年5月21日
0
0 Comments

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

查看 N1570 6.8.2 Compound statement,它分别列出了 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 Expression and null statements 中定义),它是一个语句,因此是被允许的。

0
0 Comments

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

在标签之后放置一个空语句

case 4:;

使标签现在不再紧随声明。

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

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

0