【发布时间】:2025-12-31 19:00:01
【问题描述】:
我有一些 goto-laden C++ 代码,看起来像
#include <stdlib.h>
void test0()
{
int i = 0;
loop:
i++;
if (i > 10) goto done;
goto loop;
done:
exit(EXIT_SUCCESS);
}
我想去掉gotos,同时(主要)保留原始代码的外观;或多或少地排除了for、while 等(除非它们隐藏在宏后面),因为这会过多地改变现有代码的外观。想象一下,想要最小化现有代码和更改代码之间的“差异”。
一个想法是使用带有方法的类:
class test1 final
{
int i = 0;
void goto_loop()
{
i++;
if (i > 10) goto_done();
goto_loop();
}
void goto_done()
{
exit(EXIT_SUCCESS);
}
public:
test1() { goto_loop(); }
};
这可行,但每次调用 goto_loop() 都会添加到调用堆栈中。有什么方法可以进行类似exec 的函数调用吗?也就是说,以某种方式调用“内联”函数...执行附加代码而不添加到调用堆栈?有没有办法使尾递归显式?
使用 C++20(甚至 C++23)是可以接受的,尽管 C++17 解决方案会“不错”。
对于所有想知道“为什么”的人真正的原码是BASIC...
【问题讨论】:
-
为什么没有
while或for循环? -
for (int i = 0; ++i <= 10;) { }怎么样? -
对不起,我不同意这出戏。当您的代码展开到带有两个标签的
goto时,您的代码看起来与for循环非常相似,因此您的带有两个功能的版本是更剧烈的变化恕我直言 -
“但是对
goto_loop()的每次调用都会添加到调用堆栈中。”。没必要,尾调用优化可以申请那种递归。 -
@JackBrown 您已将基于循环的解决方案更改为基于递归的解决方案。在我看来,这比将
goto方法更改为for或while循环更具侵入性。