C++ switch 内变量定义报错
·
错误场景
先来看错误示例代码:
int main() { int con = 2; switch (con) { case 1: int i = 10; //错误点 break; case 2: i = 20; break; default: break; } }如果没了解过对应的语法是不是几乎找不到错误点?报错:
// error C2360: “i”的初始化操作由“case”标签跳过 // error C2361: “default”标签跳过“i”的初始化操作这个报错是什么意思呢?这就和C++的变量初始化,作用域有关
语法介绍
首先我们先来关注switch语句的特点:
1, 所有 case 语句后的代码其实都在同一个作用域中
2, switch 会影响执行的顺序
再回到错误代码:
int main() { int con = 2; switch (con) { //两个花括号间是一个作用域 case 1: int i = 10; //错误点,不能定义并初始化变量 break; case 2: i = 20; //可以找到,但不能使用 break; default: break; } }如果我们走 2分支,在 2分支下可以找到变量i (因为所有case在同一个作用域中),但是我们并没有走过 1分支 (分支1包含变量i的初始化语句: int i = 10),这就导致变量i未初始化,而如果我们在分支2中使用变量i就会产生错误(不使用也会报错,编译器直接禁止这种情况),因为使用未初始化的变量在C++中是不安全,不被允许的。
所以C++在标准中规定了这种语法:不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置(C++ primer 163页)。
同理,其他跳转语句,比如goto 也会有这种情况:
//同一作用域中 { goto pos1; cout << "这里不会运行" << endl; int j = 10; //跳过了初始化 pos1: cout << j << endl; }报错:
解决方法
我们可以从破坏定义入手:不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置
1,不初始化,只声明:
int con = 2; switch (con) { case 1: int i; //不初始化 break; case 2: i = 20; //使用时初始化 break; default: break; } //成功运行2,修改作用域
int con = 2; switch (con) { case 1: { int i = 20; //新作用域 } break; case 2: //i = 30; 错误 //不同作用域就找不到 变量i了 break; default: break; }3,在外部定义
int con = 2; int i = 30; //外部定义 switch (con) { case 1: i = 10; //都可以找到 break; case 2: i = 30; break; default: break; }大家了解switch的错误原因后可以用goto模拟一下,加深印象
更多推荐




所有评论(0)