【问题标题】:Goto label not defined c++转到标签未定义c ++
【发布时间】:2021-08-29 00:03:03
【问题描述】:

为什么这不起作用?玩家写完一个数字后,它应该引导他们回到主菜单,而不是编译器给出标签 MainMenu not defined c++

int main()
{
    while (alive){
        MainMenu:
    }
}

void InfoPanel(){
    int choice;

    cout<<"1. Go back"<<endl;
    cin>>choice;
    if(choice==1){
        goto MainMenu;
    }
    else{
        goto MainMenu;
    }
}

这就是函数的调用方式

int MainMenuChoice;

cout<<"5.Open info panel"<<endl;
         cin>>MainMenuChoice;

 switch(MainMenuChoice){
    case 1:
        BuildingPanel();
    break;
    case 2:
        ArmyPanel();
    break;
    case 3:
        DiplomacyPanel();
    break;
    case 4:
        ActionsPanel();
    break;
    case 5:
        InfoPanel();
        goto MainMenu;
    break;
    default:
        cout<<"that doesnt seem to be correct";
        goto MainMenu;
    }

【问题讨论】:

  • 标签有一个函数作用域,所以你不能用标签从一个函数跳转到另一个函数。
  • @mediocrevegetable1 好的,有办法解决吗?
  • @DaugirdasPelanis “修复”?它没有坏
  • @gkhaos 它给出了标签 MainMenu 未定义的错误
  • @DaugirdasPelanis -- 为什么这个 goto 不起作用? -- 放弃使用 goto 并使用结构化编程。如果你继续像这样使用goto,你最终会得到spaghetti code,而且很少有人会帮助你处理这种形式的代码。他们不会浪费时间试图解开意大利面。

标签: c++ scope label goto


【解决方案1】:

来自 C++ 14 标准(3.3.5 函数范围)

1 标签 (6.1) 具有功能范围,可以在任何地方使用 声明它们的函数。只有标签才有功能范围。

在函数InfoPanel

void InfoPanel(){
    int choice;

    cout<<"1. Go back"<<endl;
    cin>>choice;
    if(choice==1){
        goto MainMenu;
    }
    else{
        goto MainMenu;
    }
}

标签MainMenu 未定义。所以编译器会发出错误信息。

使用 goto 语句是个坏主意。而是在 main 中使用一个循环,其中将调用函数 InfoPanel

【讨论】:

    【解决方案2】:

    您的 goto 不起作用,因为您的标签 MainMenu: 对于 Infopanel 函数不可见,因为它在 main 中定义并且具有范围可见性,因此可以仅在主块中使用。

    【讨论】:

      猜你喜欢
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多