【发布时间】:2011-05-16 18:52:25
【问题描述】:
我有一点不寻常的情况 - 我想使用 goto 语句来跳进入循环,而不是从中跳出。
这样做有充分的理由 - 此代码必须是某个函数的一部分,该函数在第一次调用后进行一些计算,返回新数据请求并需要再次调用才能继续。不能使用函数指针(显而易见的解决方案),因为我们需要与不支持函数指针的代码互操作。
我想知道下面的代码是否安全,即它会被所有符合标准的 C/C++ 编译器正确编译(我们需要 C 和 C++)。
function foo(int not_a_first_call, int *data_to_request, ...other parameters... )
{
if( not_a_first_call )
goto request_handler;
for(i=0; i<n; i++)
{
*data_to_request = i;
return;
request_handler:
...process data...
}
}
我研究过标准,但没有太多关于此类用例的信息。我还想知道从可移植性的角度来看,将 for 替换为等效的 while 是否有益。
提前致谢。
UPD:感谢所有发表评论的人!
致所有评论者 :) 是的,我知道我不能跳过局部变量的初始化程序,而且我必须在每次调用时保存/恢复
i。关于强项的原因:) 这段代码必须实现反向通信接口。反向通信是一种试图避免使用函数指针的编码模式。有时必须使用它,因为遗留代码希望您将使用它。
不幸的是,r-comm-interface 不能很好地实现。您不能使用函数指针,也不能轻易地将工作拆分为多个函数。
【问题讨论】:
-
“这样做的充分理由”——我没有在这篇文章中看到它们。
-
你能不能把request_handler下面的东西放在一个单独的函数里然后调用这个函数?
-
如果你声明了for循环之前标签的局部变量,那么使用这些变量的表达式的行为是未定义的。实际上,我敢打赌,关于堆栈状态的任何假设都是没有实际意义的。您显然正在这里寻找 协程,也许有这个词的一些 google 可以帮助您。
-
必填:xkcd.com/292
-
我知道这是旧的,但只是好奇你为什么不只是调用一个函数(不是函数指针,因为你说只是一个普通函数来执行相同的任务)?也许我没有正确理解?
标签: c++ c compiler-construction goto