C语言switch 第一行不能定义变量的解决办法
1.case后加一行代码
switch(cmd)
{
case CMD_A:break;
case CMD_B:
printf("加一行打印代码\n");
int test_value;
break;
default:
printf("error cmd\n");
break;
}
2.限定作用域
switch(cmd)
{
case CMD_A:break;
case CMD_B:
{int test_value;}
break;
default:
printf("error cmd\n");
break;
}
3.加一个空域
switch(cmd)
{
case CMD_A:break;
case CMD_B:
{}
int test_value;
break;
default:
printf("error cmd\n");
break;
}
4.加一个空行
switch(cmd)
{
case CMD_A:break;
case CMD_B:
;
int test_value;
break;
default:
printf("error cmd\n");
break;
}
last.直接添加定义时就会报错。
switch(cmd)
{
case CMD_A:break;
case CMD_B:
int test_value;
break;
default:
printf("error cmd\n");
break;
}
error: a label can only be part of a statement and a declaration is not a statement
错误:标签只能是语句的一部分,声明不是语句
(个人见解,不一定正确)原因分析:
1.case后的第一行不能跟一个定义或者声明;(函数和变量都不行)
2.想要在case分支中定义或者声明内容需要和case语句至少保持有一个其他语句。
3.接下来要看编译器优化了,当分支过少时是遍历分支,一般少于四个分支和ifelse没有区别,大于四个分支时,会产生一个表,先判断是否会进入default中,然后再通过表来直接跳转,当case的连续性不高时,就会产生两个表来实现跳转。因此并没有变量作用域的问题,如果是作用域,那么放在第二行理论来说也是不可行的,这应该是C语法的一种限定。当语句过多时,如果是作用域的问题就不会存在这种报错,语句都是跳转了,可能执行不到定义的位置了。
4.尽量避免在switch中定义变量。
5.建议用如下方式使用switch case
switch(cmd)
{
case CMD_A:
{
break;
}
case CMD_B:
{
int test_value;
break;
}
default:
{
printf("error cmd\n");
break;
}
}