我有一个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
}
答案 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编写代码以来,我没有使用过这个 只是不要。