You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:47:03