【C++ 异常】error: jump to case label [fpermissive]

摘要:
经过检验发现,无论其他分支是否包含定义的变量,只要case中带变量不带括号,编译器都会报错。intmain(){inttest=2;switch{case1:inti=1;cout˂˂i;break;case2:cout˂˂3;//同样会报错break;default:cout˂˂"error"˂˂endl;}}#报错信息如下//test.cpp:Infunction'intmain()'://test.cpp:error:jumptocaselabel[-fpermissive]//case2://^//test.cpp:error:crossesinitializationof'inti'//inti=1;//test.cpp:error:jumptocaselabel[-fpermissive]//default://^//test.cpp:error:crossesinitializationof'inti'//inti=1;三、修改方法1、将case1的代码用{}括起来,设定清楚变量i的作用域,避免其他case访问2、将变量i放到switch外部,switch中的每个case都可以访问四、深入了解switch语句是goto语句的一种,所以goto具备相同的性质,下述的goto语句不会被执行,变量i一定会被定义,但是会报跟上面一样的错误。这说明goto与标签之间,不能出现变量。

编译程序时,编译器报错error: jump to case label [-fpermissive] , error: crosses initialization of 'xxxx',对相关内容进行简单的梳理

一、问题代码

int main()
{
  int test = 2;
  switch(test)
  {
    case 1:
      int i = 1;  // i初始化后,一直存在,直到switch结束
      cout << i;
      break;
    case 2:
      cout << i;  // i未被初始化
      break;
    default:
      cout << "error" << endl;
  }
}
#报错信息如下
//test.cpp: In function 'int main()':
//test.cpp: error: jump to case label [-fpermissive]
//   case 2:
//        ^
//test.cpp: error:   crosses initialization of 'int i'
//    int b = 1;
//test.cpp: error: jump to case label [-fpermissive]
//   default:
//   ^
//test.cpp:11:8: error:   crosses initialization of 'int i'
//    int b = 1;

二、说明
从上面的代码中可以看出,因为switch中没有单独的区域块来限定变量i的声明周期,所以变量的作用域是初始化点到switch的结尾处。这里由于我们无法确定其他case中是否会使用到这种变量,使用之前变量是否被初始化,所以编译器会报错。例如:test值为2,直接执行case 2的话,未定义变量就会出异常。这也是编译器报错crosses initialization的原因。

经过检验发现,无论其他分支是否包含定义的变量,只要case中带变量不带括号,编译器都会报错

int main()
{
  int test = 2;
  switch(test)
  {
    case 1:
      int i = 1; 
      cout << i;  
      break;
    case 2:
      cout << 3; // 同样会报错
      break;
    default:
      cout << "error" << endl;
  }
}
#报错信息如下
//test.cpp: In function 'int main()':
//test.cpp: error: jump to case label [-fpermissive]
//   case 2:
//        ^
//test.cpp: error:   crosses initialization of 'int i'
//    int i = 1;
//test.cpp: error: jump to case label [-fpermissive]
//   default:
//   ^
//test.cpp: error:   crosses initialization of 'int i'
//    int i = 1;

三、修改方法
1、【缩小作用域】将case 1的代码用{ }括起来,设定清楚变量i的作用域,避免其他case访问
2、【扩大作用域】将变量i放到switch外部,switch中的每个case都可以访问

四、深入了解
switch语句是goto语句的一种,所以goto具备相同的性质,下述的goto语句不会被执行,变量i一定会被定义,但是会报跟上面一样的错误。这说明goto与标签之间,不能出现变量。变量必须出现在goto之前或标签之后。

int main()
{
    if(0)
    {
        goto end;
    }

    int i = 1;

    end:
       cout << i;
}
#报错信息如下:
//test.cpp: In function 'int main()':
//test.cpp error: jump to label 'end' [-fpermissive]
//   end:
//   ^
//test.cpp error:   from here [-fpermissive]
//          goto end;
//               ^
//test.cpp: error:   crosses initialization of 'int i'
//     int i = 1;

上述例子,将变量的初始化放在goto标签之前,或者end标签之后,都是可以的

免责声明:文章转载自《【C++ 异常】error: jump to case label [fpermissive]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关键字驱动和数据驱动Web渗透——web服务器指纹识别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

GCC 中的编译器堆栈保护技术(转)

转自:https://www.cnblogs.com/gt-xy/p/7749725.html 前几天看到的觉得不错得博客于是转发了,但这里我补充一下一些点。 GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_chk_guard和__stack_chk_fail分别是存储canary word值的地址...

docker pull 覆盖本地镜像问题

验证: $ docker images |grep cookdata test-cache 1.0.0 fededff87eb2 About a minute ago 6.2GB (base) [wu...

Tp5使用消息队列实现邮键发送

1、首先,compare需要下载安转包,如果你有的话就可以直接使用这个扩展包  消息队列扩展 composer require topthink/think-queue 在extra文件夹中的queue.php进行配置 return [ 'connector' => 'database', 'table' => 'j...

R语言做正态分布检验

摘自:吴喜之:《非参数统计》(第二版),中国统计出版社,2006年10月:P164-165 1、ks.test() 例如零假设为N(15,0.2),则ks.test(x,"pnorm",15,0.2)。如果不是正态分布,还可以选"pexp", "pgamma"等。 2、shapiro.test() 可以进行关于正态分布的Shapiro-Wilk检验。...

数字识别,神经网络

来源:https://www.numpy.org.cn/deep/basics/fit_a_line.html 数字识别 本教程源代码目录在book/recognize_digits,初次使用请您参考Book文档使用说明。 #说明: 硬件环境要求: 本文可支持在CPU、GPU下运行 Docker镜像支持的CUDA/cuDNN版本: 如果使用了Docke...

Linux中计划任务执行脚本crontab-简洁版

我使用的是ubuntu16,所以在ubuntu中一切正常,在其他linux系统中应该都差不多。   1 计划任务,crontab命令选项:     -u指定一个用户,     -l列出某个用户的任务计划,     -r删除某个用户的任务,     -e编辑某个用户的任务   2 cron文件语法:     分     小时   日       月    ...