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;
		}
}
posted @ 2022-07-28 19:38  Smah  阅读(519)  评论(0编辑  收藏  举报