goto语句在C ++中的用法

时间:2014-01-17 15:13:24

标签: c++ goto

我有一个funcA我称之为每毫秒。另一个funcB。我想用goto语句。但是,当我查看流程时(m_tempdata不是NULL时),打印"stage 2"后,它也会打印"cleanup starts"。通常情况下,我希望在下一轮打印"stage 2"后返回。我错了吗?

void ClassA::funcA()
{
    m_tempdata = m_freedata;

    printf("stage 1 \n");

    if (NULL == m_tempdata)
    {
        printf("going cleaning \n" );
        goto cleanup;
    }
    m_freedata = m_tempdata->next;

    printf("stage 2 \n");

cleanup: printf("cleanup starts \n");
    // ... some additional work todo
}

5 个答案:

答案 0 :(得分:3)

  

通常,我希望在下一次打印“第2阶段”后返回   转。我错了吗?

是的,你错了

如果没有跳转标签,代码将直接转到它并继续。标签不是指令。它不会导致程序神奇地返回或跳转到其他地方。

这是一个更好的方式来写这个:

void ClassA::funcA()
{
  m_tempdata = m_freedata;

  printf("stage 1 \n");

  if (NULL == m_tempdata)
  {
    printf("going cleaning \n" );
    Cleanup();
    return;
  }

  m_freedata = m_tempdata->next;
}

void ClassA::Cleanup()
{
  printf("cleanup starts \n");
  //      ... some additional work todo
}

请不要使用goto。它使代码更难以理解,调试和维护。另外,你最终会犯这样的愚蠢错误,因为你之前做出了糟糕的设计决定。而是使用现代流控制结构。

答案 1 :(得分:1)

您似乎没有一个好的/令人信服的理由在此代码中使用goto,所以不要。使用更易读的控制流结构。

printf("stage 1\n");
if (NULL != m_tempdata)
{
    printf("stage 2\n");
    // ...
}
else
{
    printf("cleanup starts\n");
    // ...
}

如果您需要进行清理而不管“阶段2”是否运行,请删除else块并在最后使用清理代码。

答案 2 :(得分:0)

为什么要停止?没有什么可以中断语句printf("stage 2 \n");和语句printf("cleanup starts \n");(恰好标记为cleanup:)之间的控制流。

如果您确实希望它中断,则必须在return标签前插入cleanup:声明。

但是,请使用goto认真重新考虑。它使程序很难推理 - 总是更喜欢结构化流程(if,循环,函数调用)。

答案 3 :(得分:0)

没有什么可以告诉编译器该函数应该在“阶段2”之后退出。如果你想要它返回,你必须通过添加return语句来实际告诉编译器。

答案 4 :(得分:0)

我怀疑你正在尝试使用像这样的老式C编程模式:

void do_hot_stuff (void)
{
    void * data1 = malloc (123);
    if (data1 == NULL) goto fail1;

    void * data2 = malloc (123);
    if (data2 == NULL) goto fail2;

    void * data3 = malloc (123);
    if (data3 == NULL) goto fail3;

    // do your hot stuff here

    free (data3);
    fail3:
    free(data2);
    fail2:
    free(data1);
    fail1:
}

坦率地说,自从我上次为80年代后期的Amiga编写代码以来,我没有使用过这个 只是不要。