错误:标签“foo”已使用但未定义

时间:2013-05-31 07:45:03

标签: c++ function label goto

所以我一直在使用一些C ++,并使用一些类似的代码得到了之前声明的错误:

#include <iostream>
using namespace std;

char foodstuffs;

void fruit()
{
cin>>foodstuffs;
switch(foodstuffs)
{
case 'a': goto foo; break;
case 'b': goto fooo; break;
}
}

int main()
{
cout<<"What do you want to eat? (a/b)";
fruit();
foo: cout<<"You eat an apple.";
fooo: cout<<"You eat a banana.";
}

确切的代码要复杂得多,但这只是为了向您展示我得到的错误。

现在我意识到每个人都出于某种原因鄙视“goto”声明,但是我的实际代码中充满了很多东西,我没有时间/耐心回去改变它们。另外,我是一个新手程序员,我发现很难使用的东西和标签。

我的问题是如何预定义这些标签,以便函数fruit()知道它们是什么?另外,我需要在不将标签移出主函数的情况下执行此操作。

4 个答案:

答案 0 :(得分:7)

goto语句只能转到本地定义的标签,不能跳转到其他功能。

因此main中的标签不会被引用,goto中的fruit语句将找不到标签。

答案 1 :(得分:4)

尝试做什么 - 在函数之间跳转 - 由于一系列原因无效,尤其是对象范围和生命时间,请考虑:

void foo()
{
    if(feelLikeIt)
       goto foobar;
}

void bar()
{
    std::string message = "Hello";
foobar:
    cout << message << endl;
}

从foo跳到foobar是非法的,因为“message”将不存在。

所以简单的语言不允许你这样做。

此外,您尝试使用“goto”的方式会阻止您重新使用“fruit()”函数,因为它总是决定如何处理选择而不是调用它的函数。如果你想这样做怎么办:

cout<<"What do you want to eat? (a/b)";
fruit();
foo: cout<<"You eat an apple.";
fooo: cout<<"You eat a banana.";
cout<<"What does your friend want to eat? (a/b)";
fruit();
// oops, you just created a loop because fruit made the decision on what to do next.

您实际上想要做的是使用“fruit()”作为返回值的函数。

enum Fruit { NoSuchFruit, Apple, Banana };

Fruit fruit(const char* request)
{
    char foodstuffs;
    cout << request << " (a/b)";
    cin >> foodstuffs;
    switch (foodstuffs)
    {
        case 'a': return Apple;
        case 'b': return Banana;
        default:
            cout << "Don't recognize that fruit (" << foodstuffs << ")." << endl;
            return NoSuchFruit;
    }
}

const char* fruitNames[] = { "nothing", "an apple" ,"a banana" };

int main()
{
    Fruit eaten = fruit("What do you want to eat?");
    cout << "You ate " << fruitNames[eaten] << "." << endl;
    eaten = fruit("What does your friend want to eat?");
    cout << "Your friend ate " << fruitNames[eaten] << "." << endl;
}

答案 2 :(得分:1)

对不起。您不能goto到当前执行函数之外的标签。此外,goto的使用还有其他限制。例如,您不能使用goto跳过变量定义。还有一些我不太清楚的事情。

底线?

不要使用goto

答案 3 :(得分:0)

goto不能用于在当前函数之外导航。尝试从函数返回一些东西,并在if else条件下使用它。