C++中
switch出现error: jump to case label [-fpermissive]报错信息的处理方法:
根因分析
通常在一个作用域下,只有先 声明 或者 声明且初始化 变量,才可以再使用。 switch 整个花括号是一个作用域,每一条 case 默认不会开启一个新的作用域;而且 switch 语句里面的分支是会跳的,并不是从上往下依次执行,所以没办法保证每一条语句都会执行。
char var; // 单一的声明
char var = 'D'; // 声明且初始化
// 这两种行为是有差异的。
在switch里面,任意地方,都可以进行单一的声明。这种单一声明是为了编译器在执行下面的语句的时候,能够认识这个符号是什么类型的,比如说 var 是个 char 类型。在实际运行起来(run time)的时候,这种单一声明没有对应的机器指令,不需要跑。
但是,声明且初始化: char var = 'D'。这一句不仅仅是编译时的过程,在run time时,也是有指令的,需要运行这一句才能达到相应的效果。换句话说,如果不能运行这一句,这句话的效果就没达到,那么干脆在编译时,直接禁止你使用。那什么时候,不能运行这一句呢?switch 分支选择的时候,就是这种情况。
如何解决
由于在switch中声明了一些变量,编译器会认为变量在执行的时候未定义,所以会出错,这个时候的解决方法有两种:
1:用if else 代替 switch 语句;
2:在case中用{}将代码括起来, 这样在{}中就能定义变量了;
3:如果变量在各个case中都要用的话, 就把变量定义在switch外面。
这里我比较喜欢就括起来,不用很大的改动,修改之后程序就正常执行了。
代码调试不易,转载请标明出处!
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作分享的最大动力,谢谢!
References
0.Standard C++
1.cppreference.com
2.apiref.com/cpp-zh
3.cplusplus.com
4.C++ 标准库参考 | Microsoft Learn
5.C++ 教程 | 菜鸟教程\
可以肯定的是学海无涯,这篇文章也会随着对 C++ 的深入学习而持续更新,
欢迎各位在评论区留言进行探讨交流。