如何解决C++编译报错:‘无法从switch跳转到该case标签’
C++ switch分支编译错误:cannot jump from switch statement to this case label 解决
问题描述
编译包含多层switch分支的C++程序时,触发错误:
cannot jump from switch statement to this case label
所有case分支均出现该错误,怀疑与缺少大括号有关。相关代码如下:
#include <iostream> #include <vector> #include "veiculo.h" #include "concessionaria.h" int main() { std::vector < concessionaria > concessionarias; int o; do { std::cout << "1. Criar concessionária\n"; std::cout << "2. Selecionar concessionária\n"; std::cout << "0. Sair\n"; std::cin >> o; switch (o) { case 1: std::string nomeConcessionaria, cnpjConcessionaria; std::cout << "Nome da Concessionária: "; std::cin >> nomeConcessionaria; std::cout << "CNPJ da Concessionária: "; std::cin >> cnpjConcessionaria; concessionarias.emplace_back(nomeConcessionaria, cnpjConcessionaria); break; case 2: if (concessionarias.empty()) { std::cout << "Nenhuma concessionária criada.\n"; continue; } std::cout << "Concessionárias disponíveis:\n"; for (size_t i = 0; i < concessionarias.size(); ++i) { std::cout << i + 1 << ". " << concessionarias[i].getNome() << "\n"; } int escolha; std::cout << "Escolha uma concessionária (1-" << concessionarias.size() << "): "; std::cin >> escolha; if (escolha >= 1 && escolha <= static_cast < int > (concessionarias.size())) { concessionaria & concessionariaAtual = concessionarias[escolha - 1]; do { std::cout << "1. Adicionar veículo\n"; std::cout << "2. Remover veículo\n"; std::cout << "0. Voltar para a seleção de concessionária\n"; std::cin >> o; switch (o) { case 1: std::string marca, chassi; int preco, ano; std::cout << "\nEscolha o tipo de veículo:\n"; std::cout << "1. Automóvel\n"; std::cout << "2. Moto\n"; std::cout << "3. Caminhão\n"; std::cin >> o; veiculo * novoVeiculo = nullptr; switch (o) { case 1: std::string motor; std::cout << "Informe a marca, o preço, o nº do chassi, o ano de fabricação e o tipo de motor:\n"; std::cin >> marca; std::cin >> preco; std::cin >> chassi; std::cin >> ano; std::cin >> motor; novoVeiculo = new automovel(marca, preco, chassi, ano, motor); break; case 2: std::string modelo; std::cout << "Informe a marca, o preço, o nº do chassi, o ano de fabricação e o modelo:\n"; std::cin >> marca; std::cin >> preco; std::cin >> chassi; std::cin >> ano; std::cin >> modelo; novoVeiculo = new moto(marca, preco, chassi, ano, modelo); break; case 3: std::string carga; std::cout << "Informe a marca, o preço, o nº do chassi, o ano de fabricação e o tipo de carga:\n"; std::cin >> marca; std::cin >> preco; std::cin >> chassi; std::cin >> ano; std::cin >> carga; novoVeiculo = new caminhao(marca, preco, chassi, ano, carga); break; default: std::cout << "Opção inválida!\n"; break; } if (novoVeiculo != nullptr) { concessionariaAtual.adicionar(novoVeiculo); } break; case 2: std::string chassi_; std::cout << "Digite o número do chassi do veículo a ser removido: "; std::cin >> chassi_; concessionariaAtual.remover(chassi_); break; case 0: std::cout << "Voltando para a seleção de concessionária.\n"; break; default: std::cout << "Opção inválida!\n"; break; } } while (o != 0); } else { std::cout << "Escolha inválida!\n"; } break; case 0: std::cout << "Encerrando o programa.\n"; break; default: std::cout << "Opção inválida!\n"; break; } } while (o != 0); return 0; }
错误原因
C++标准禁止跳过变量的初始化语句直接进入switch的case分支。当你在case分支中声明带有构造函数的变量(比如std::string),如果switch跳转到其他case,会绕过这些变量的构造过程,导致未初始化的变量存在,这属于未定义行为,因此编译器会抛出错误。
解决方法
给每个包含变量声明的case分支添加大括号{},将变量的作用域限制在当前case内部,避免跨case的作用域问题。
完整修改后的代码
#include <iostream> #include <vector> #include "veiculo.h" #include "concessionaria.h" int main() { std::vector < concessionaria > concessionarias; int o; do { std::cout << "1. Criar concessionária\n"; std::cout << "2. Selecionar concessionária\n"; std::cout << "0. Sair\n"; std::cin >> o; switch (o) { case 1: { std::string nomeConcessionaria, cnpjConcessionaria; std::cout << "Nome da Concessionária: "; std::cin >> nomeConcessionaria; std::cout << "CNPJ da Concessionária: "; std::cin >> cnpjConcessionaria; concessionarias.emplace_back(nomeConcessionaria, cnpjConcessionaria); break; } case 2: { if (concessionarias.empty()) { std::cout << "Nenhuma concessionária criada.\n"; continue; } std::cout << "Concessionárias disponíveis:\n"; for (size_t i = 0; i < concessionarias.size(); ++i) { std::cout << i + 1 << ". " << concessionarias[i].getNome() << "\n"; } int escolha; std::cout << "Escolha uma concessionária (1-" << concessionarias.size() << "): "; std::cin >> escolha; if (escolha >= 1 && escolha <= static_cast < int > (concessionarias.size())) { concessionaria & concessionariaAtual = concessionarias[escolha - 1]; do { std::cout << "1. Adicionar veículo\n"; std::cout << "2. Remover veículo\n"; std::cout << "0. Voltar para a seleção de concessionária\n"; std::cin >> o; switch (o) { case 1: { std::string marca, chassi; int preco, ano; std::cout << "\nEscolha o tipo de veículo:\n"; std::cout << "1. Automóvel\n"; std::cout << "2. Moto\n"; std::cout << "3. Caminhão\n"; std::cin >> o; veiculo * novoVeiculo = nullptr; switch (o) { case 1: { std::string motor; std::cout << "Informe a marca, o preço, o nº do chassi, o ano de fabricação e o tipo de motor:\n"; std::cin >> marca; std::cin >> preco; std::cin >> chassi; std::cin >> ano; std::cin >> motor; novoVeiculo = new automovel(marca, preco, chassi, ano, motor); break; } case 2: { std::string modelo; std::cout << "Informe a marca, o preço, o nº do chassi, o ano de fabricação e o modelo:\n"; std::cin >> marca; std::cin >> preco; std::cin >> chassi; std::cin >> ano; std::cin >> modelo; novoVeiculo = new moto(marca, preco, chassi, ano, modelo); break; } case 3: { std::string carga; std::cout << "Informe a marca, o preço, o nº do chassi, o ano de fabricação e o tipo de carga:\n"; std::cin >> marca; std::cin >> preco; std::cin >> chassi; std::cin >> ano; std::cin >> carga; novoVeiculo = new caminhao(marca, preco, chassi, ano, carga); break; } default: { std::cout << "Opção inválida!\n"; break; } } if (novoVeiculo != nullptr) { concessionariaAtual.adicionar(novoVeiculo); } break; } case 2: { std::string chassi_; std::cout << "Digite o número do chassi do veículo a ser removido: "; std::cin >> chassi_; concessionariaAtual.remover(chassi_); break; } case 0: { std::cout << "Voltando para a seleção de concessionária.\n"; break; } default: { std::cout << "Opção inválida!\n"; break; } } } while (o != 0); } else { std::cout << "Escolha inválida!\n"; } break; } case 0: { std::cout << "Encerrando o programa.\n"; break; } default: { std::cout << "Opção inválida!\n"; break; } } } while (o != 0); return 0; }
内容的提问来源于stack exchange,提问作者PedroAC7
相关产品推荐
相关产品推荐

