error: crosses initialization of xxx IN switch case

本文深入解析了C++标准中关于局部变量初始化与switch跳转之间的相互作用,强调了当跳转到局部变量未初始化的范围时,必须确保变量具有POD类型且未被初始化,否则程序将被视为非法构造。通过示例代码展示正确与错误的初始化方式,并提供修正建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  

 

The C++ standard says:

It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer.

The cases in switch are considered as a "jump".

Just put all objects and variables initializations before your switch, and everything will be fine.

Consider this code:

switch(k){case1:int t =4;break;default:break;}

It will cause a "crosses initialization" error, because it is possible to skip the initialization of t, but after that it will still be in scope, even though it was never created in the first place.

Now consider this:

switch(k){case1:{int t =4;}break;default:break;}

Here, you will not have the error, because the variable is inside a block, and will die at the end of the block ( at the closing { ), so after that it will not be in scope in any case.

To fix the first case, you just need to do:

int t =0;switch(k){case1:
        t =4;break;default:break;}
 

转载于:https://www.cnblogs.com/zhangyz/articles/3145531.html

出现错误了37266687.cpp: In function ‘int main()’: 37266687.cpp:31:22: error: jump to case label 31 | case '-': | ^~~ 37266687.cpp:28:25: note: crosses initialization ofint c’ 28 | int c = n.top(); n.pop(); | ^ 37266687.cpp:27:25: note: crosses initialization ofint b’ 27 | int b = n.top(); n.pop(); | ^ 37266687.cpp:37:22: error: jump to case label 37 | case '*': | ^~~ 37266687.cpp:28:25: note: crosses initialization ofint c’ 28 | int c = n.top(); n.pop(); | ^ 37266687.cpp:27:25: note: crosses initialization ofint b’ 27 | int b = n.top(); n.pop(); | ^ 37266687.cpp:43:22: error: jump to case label 43 | case '/': | ^~~ 37266687.cpp:28:25: note: crosses initialization ofint c’ 28 | int c = n.top(); n.pop(); | ^ 37266687.cpp:27:25: note: crosses initialization ofint b’ 27 | int b = n.top(); n.pop(); | ^ 37266687.cpp:49:22: error: jump to case label 49 | case ' ': | ^~~ 37266687.cpp:28:25: note: crosses initialization ofint c’ 28 | int c = n.top(); n.pop(); | ^ 37266687.cpp:27:25: note: crosses initialization ofint b’ 27 | int b = n.top(); n.pop(); |请修改#include <iostream> #include <stack> #include <cctype> using namespace std; int main() { stack<int> n; char s; int a = 0; // 当前操作数 bool inNum = false; // 标记是否在读取数字 while ((s = getchar()) != '@') { if (isdigit(s)) { a = a * 10 + (s - '0'); inNum = true; } else { // 遇到非数字字符时,将当前操作数入栈(如果有) if (inNum) { n.push(a); a = 0; inNum = false; } switch (s) { case '+': if (n.size() < 2) break; int b = n.top(); n.pop(); int c = n.top(); n.pop(); n.push(c + b); break; case '-': if (n.size() < 2) break; b = n.top(); n.pop(); c = n.top(); n.pop(); n.push(c - b); // 注意顺序:c - b break; case '*': if (n.size() < 2) break; b = n.top(); n.pop(); c = n.top(); n.pop(); n.push(c * b); break; case '/': if (n.size() < 2) break; b = n.top(); n.pop(); c = n.top(); n.pop(); if (b != 0) n.push(c / b); // 避免除零错误 break; case ' ': // 空格不处理,已在前面的if(inNum)中处理 break; } } } // 处理最后一个操作数(如果有) if (inNum) n.push(a); if (!n.empty()) cout << n.top(); return 0; }
07-31
====================[ 构建 | videoProj | Debug-rk ]=============================== /usr/bin/cmake --build /home/ly/project/videoTest/cmake-build-debug-rk --target videoProj -- -j 3 Scanning dependencies of target videoProj [ 33%] Building CXX object CMakeFiles/videoProj.dir/main.cpp.o /home/ly/project/videoTest/main.cpp: In function 'int main()': /home/ly/project/videoTest/main.cpp:488:35: error: 'MPP_ENC_SET_WIDTH' was not declared in this scope; did you mean 'MPP_ENC_SET_SPLIT'? 488 | mpp_enc->control(encoder_ctx, MPP_ENC_SET_WIDTH, param); | ^~~~~~~~~~~~~~~~~ | MPP_ENC_SET_SPLIT /home/ly/project/videoTest/main.cpp:490:35: error: 'MPP_ENC_SET_HEIGHT' was not declared in this scope; did you mean 'MPP_ENC_SET_SPLIT'? 490 | mpp_enc->control(encoder_ctx, MPP_ENC_SET_HEIGHT, param); | ^~~~~~~~~~~~~~~~~~ | MPP_ENC_SET_SPLIT /home/ly/project/videoTest/main.cpp:492:35: error: 'MPP_ENC_SET_FPS' was not declared in this scope; did you mean 'MPP_ENC_SET_CFG'? 492 | mpp_enc->control(encoder_ctx, MPP_ENC_SET_FPS, param); | ^~~~~~~~~~~~~~~ | MPP_ENC_SET_CFG /home/ly/project/videoTest/main.cpp:494:35: error: 'MPP_ENC_SET_BITRATE' was not declared in this scope; did you mean 'MPP_ENC_SET_USERDATA'? 494 | mpp_enc->control(encoder_ctx, MPP_ENC_SET_BITRATE, param); | ^~~~~~~~~~~~~~~~~~~ | MPP_ENC_SET_USERDATA /home/ly/project/videoTest/main.cpp:584:65: error: 'MPP_PACKET_FLAG_INTRA' was not declared in this scope 584 | pkt->flags = (mpp_packet_get_flag(enc_packet) & MPP_PACKET_FLAG_INTRA) ? | ^~~~~~~~~~~~~~~~~~~~~ /home/ly/project/videoTest/main.cpp:604:1: error: jump to label 'CLEANUP' 604 | CLEANUP: | ^~~~~~~ /home/ly/project/videoTest/main.cpp:471:14: note: from here 471 | goto CLEANUP; | ^~~~~~~ /home/ly/project/videoTest/main.cpp:479:9: note: crosses initialization of 'int bitrate' 479 | int bitrate = 4000000; // 4Mbps | ^~~~~~~ /home/ly/project/videoTest/main.cpp:478:9: note: crosses initialization of 'int fps' 478 | int fps = 30; | ^~~ /home/ly/project/videoTest/main.cpp:477:9: note: crosses initialization of 'int height' 477 | int height = 1080; | ^~~~~~ /home/ly/project/videoTest/main.cpp:476:9: note: crosses initialization of 'int width' 476 | int width = 1920; | ^~~~~ /home/ly/project/videoTest/main.cpp:475:14: note: crosses initialization of 'void* param' 475 | MppParam param = nullptr; | ^~~~~ /home/ly/project/videoTest/main.cpp:604:1: error: jump to label 'CLEANUP' 604 | CLEANUP: | ^~~~~~~ /home/ly/project/videoTest/main.cpp:467:14: note: from here 467 | goto CLEANUP; | ^~~~~~~ /home/ly/project/videoTest/main.cpp:479:9: note: crosses initialization of 'int bitrate' 479 | int bitrate = 4000000; // 4Mbps | ^~~~~~~ /home/ly/project/videoTest/main.cpp:478:9: note: crosses initialization of 'int fps' 478 | int fps = 30; | ^~~ /home/ly/project/videoTest/main.cpp:477:9: note: crosses initialization of 'int height' 477 | int height = 1080; | ^~~~~~ /home/ly/project/videoTest/main.cpp:476:9: note: crosses initialization of 'int width' 476 | int width = 1920; | ^~~~~ /home/ly/project/videoTest/main.cpp:475:14: note: crosses initialization of 'void* param' 475 | MppParam param = nullptr; | ^~~~~ /home/ly/project/videoTest/main.cpp:604:1: error: jump to label 'CLEANUP' 604 | CLEANUP: | ^~~~~~~ /home/ly/project/videoTest/main.cpp:461:14: note: from here 461 | goto CLEANUP; | ^~~~~~~ /home/ly/project/videoTest/main.cpp:479:9: note: crosses initialization of 'int bitrate' 479 | int bitrate = 4000000; // 4Mbps | ^~~~~~~ /home/ly/project/videoTest/main.cpp:478:9: note: crosses initialization of 'int fps' 478 | int fps = 30; | ^~~ /home/ly/project/videoTest/main.cpp:477:9: note: crosses initialization of 'int height' 477 | int height = 1080; | ^~~~~~ /home/ly/project/videoTest/main.cpp:476:9: note: crosses initialization of 'int width' 476 | int width = 1920; | ^~~~~ /home/ly/project/videoTest/main.cpp:475:14: note: crosses initialization of 'void* param' 475 | MppParam param = nullptr; | ^~~~~ /home/ly/project/videoTest/main.cpp:604:1: error: jump to label 'CLEANUP' 604 | CLEANUP: | ^~~~~~~ /home/ly/project/videoTest/main.cpp:457:14: note: from here 457 | goto CLEANUP; | ^~~~~~~ /home/ly/project/videoTest/main.cpp:479:9: note: crosses initialization of 'int bitrate' 479 | int bitrate = 4000000; // 4Mbps | ^~~~~~~ /home/ly/project/videoTest/main.cpp:478:9: note: crosses initialization of 'int fps' 478 | int fps = 30; | ^~~ /home/ly/project/videoTest/main.cpp:477:9: note: crosses initialization of 'int height' 477 | int height = 1080; | ^~~~~~ /home/ly/project/videoTest/main.cpp:476:9: note: crosses initialization of 'int width' 476 | int width = 1920; | ^~~~~ /home/ly/project/videoTest/main.cpp:475:14: note: crosses initialization of 'void* param' 475 | MppParam param = nullptr; | ^~~~~ make[3]: *** [CMakeFiles/videoProj.dir/build.make:63: CMakeFiles/videoProj.dir/main.cpp.o] Error 1 make[2]: *** [CMakeFiles/Makefile2:76: CMakeFiles/videoProj.dir/all] Error 2 make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/videoProj.dir/rule] Error 2 make: *** [Makefile:118: videoProj] 上述代码编译报错,如何解决
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值