📅  最后修改于: 2023-12-03 15:26:15.660000             🧑  作者: Mango
在 C++ 中,使用 switch 语句时,如果在 case 子句中使用了 goto 语句跳转到 switch 语句外的标签,会出现“无法从 switch 语句跳转到这种情况标签”的编译错误。
这是因为 switch 语句有自己的语法和流程控制,不能够跨越 case 子句去到达其他标签。
下面我们将通过代码片段演示这个错误和如何避免它。
#include <iostream>
int main() {
int num = 3;
switch (num) {
case 1:
std::cout << "Number is 1." << std::endl;
break;
case 2:
std::cout << "Number is 2." << std::endl;
goto label; // 跳转到标签
break;
case 3:
std::cout << "Number is 3." << std::endl;
break;
}
std::cout << "Switch statement ended." << std::endl;
label:
std::cout << "Goto label executed." << std::endl;
return 0;
}
这段代码中,在 switch 语句的第二个 case 子句中使用了 goto 语句跳转到了标签 label,但是这样的代码是不被允许的,编译器会提示“无法从 switch 语句跳转到这种情况标签”的错误。
为了避免这种错误,我们应该尽量避免使用 goto 语句,改用其他方式实现代码逻辑。在上面的代码中,可以将 case 2 中的代码放到一个函数中,然后在 case 2 中直接调用该函数,避免了跳转到其他的标签。
#include <iostream>
void case2() {
std::cout << "Number is 2." << std::endl;
}
int main() {
int num = 3;
switch (num) {
case 1:
std::cout << "Number is 1." << std::endl;
break;
case 2:
case2(); // 直接调用函数
break;
case 3:
std::cout << "Number is 3." << std::endl;
break;
}
std::cout << "Switch statement ended." << std::endl;
return 0;
}
通过将 case 2 中的代码放在了函数 case2() 中,并在 switch 语句中直接调用该函数,可以避免“无法从 switch 语句跳转到这种情况标签”的错误,使代码更加清晰、易读。