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是有好处的