Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ goto语句在C+中的用法+;_C++_Goto - Fatal编程技术网

C++ goto语句在C+中的用法+;

C++ goto语句在C+中的用法+;,c++,goto,C++,Goto,我有一个funcA,我每毫秒调用一次。通过另一个funcB。我想使用goto语句。但是,当我查看流时(当m_tempdata不是NULL),在打印“阶段2”之后,它也打印“清理开始”。通常,我希望在下一轮打印“第2阶段”后返回。我错了吗 void ClassA::funcA() { m_tempdata = m_freedata; printf("stage 1 \n"); if (NULL == m_tempdata) { printf("g

我有一个
funcA
,我每毫秒调用一次。通过另一个
funcB
。我想使用goto语句。但是,当我查看流时(当
m_tempdata
不是
NULL
),在打印
“阶段2”
之后,它也打印
“清理开始”
。通常,我希望在下一轮打印“第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
}

为什么要停止?语句
printf(“阶段2\n”)之间的控制流没有中断
和语句
printf(“cleanup start\n”)(恰好被标记为
清理:

如果您确实希望它中断,则必须在
清除:
标签之前插入
return
语句


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

为什么要停止?语句
printf(“阶段2\n”)之间的控制流没有中断
和语句
printf(“cleanup start\n”)(恰好被标记为
清理:

如果您确实希望它中断,则必须在
清除:
标签之前插入
return
语句


但请认真考虑使用
goto
。这使得程序很难推理——总是喜欢结构化流(
if
s、循环、函数调用)。

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

没有任何东西可以告诉编译器函数应该在“阶段2”之后退出。如果你想让它返回,你必须通过添加一个
return
语句来告诉编译器。

你似乎没有一个好的/令人信服的理由在这段代码中使用
goto
,所以不要这样做。使用更可读的控制流结构

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

如果无论“第2阶段”是否运行,您都需要执行清理,请删除
else
块,并将清理代码放在末尾。

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

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

如果无论“stage 2”是否运行,都需要执行清理,请删除
else
块,并在末尾使用清理代码。

我怀疑您正在尝试使用类似以下的老式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编写代码以来,我就没有使用过它。

不要这样做。

我怀疑您正在尝试使用一种老式的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编写代码以来,我就没有使用过它。
别这样

通常情况下,我希望在下一次打印“阶段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
}
是的,你错了

在标签没有跳转到的情况下,代码将直接跳转到标签并继续。标签不是说明。它不会导致程序神奇地返回或跳转到其他地方

这里有一个更好的方法来写:

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
。这使得代码更难理解、调试和维护。此外,你最终也会像在这里一样犯愚蠢的错误,因为你之前做了糟糕的设计决策。改用现代的流控制结构

通常情况下,我希望在下一次打印“阶段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
}
是的,你错了

在标签没有跳转到的情况下,代码将直接跳转到标签并继续。标签不是说明。它不会导致程序神奇地返回或跳转到其他地方

这里有一个更好的方法来写:

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
。这使得代码更难理解、调试和维护。此外,你最终也会像在这里一样犯愚蠢的错误,因为你之前做了糟糕的设计决策。改用现代的流量控制结构。

为什么希望它返回<代码>清理:
只是语句之间的标签。此外,这里也没有充分的理由证明
goto
是正确的:v你收获了你所播种的,这应该很有趣……你为什么期望它会回来<代码>清理:
只是语句之间的标签。另外,这里也没有充分的理由来证明
goto
的合理性:这应该很有趣……实际上,由于清理是由goto语句调用的,所以我认为它只有在调用goto时才会执行。有没有可能让它不返回就工作?@AvbAvb您仍然可以使用
return
而不使用表达式:
return。它将在
return
语句处从函数返回(带或不带返回值)。实际上,由于cleanup是由goto语句调用的,所以我认为它只在调用goto时执行。有没有可能让它不返回就工作?@AvbAvb您仍然可以使用
return
而不使用表达式:
return。它将在
return
语句处从函数返回(带返回值或不带返回值)。我认为您将标签和末尾的语句弄混了:)您可能仍然可以在库中找到此类内容,例如OpenSSL,但我确实希望人们不要继续编写此类代码。几年前,我看到一些生产代码,其中大多数函数都包含一个巨大的while循环,它包装了“热门内容”,以便捕获异常情况。讨厌的东西,但还是比goto好。
:)@mihaitor-Mmmm。。。我认为语句的位置是可以的(如果您没有分配data3,您只需要释放data2和data1),但无论如何,这对mu是有好处的