gpt4 book ai didi

c - while(1) .. break 而不是 goto

转载 作者:太空狗 更新时间:2023-10-29 16:30:00 25 4
gpt4 key购买 nike

我在一个C程序中找到了如下代码:

while (1)
{
do_something();
if (was_an_error()) break;

do_something_else();
if (was_an_error()) break;

[...]

break;
}
[cleanup code]

这里 while(1) 被用作“finally”的本地模拟。您还可以使用 gotos 编写此代码:

do_something()
if (was_an_error()) goto out;

do_something_else()
if (was_an_error()) goto out;

[...]
out:
[cleanup code]

我认为 goto 解决方案是一个常用的习惯用法。我在内核源代码中多次看到这个习惯用法,并且在 Diomidis Spinellis 的“代码阅读”一书中也提到了它。

我的问题是:哪种解决方案更好?使用 while(1) 解决方案是否有任何特定原因?

问题 943826没有回答我的问题。

最佳答案

看似普遍的对 GOTO 的反感很大程度上是由于 Edsger Dijkstra 的信“Go To Statement Considered Harmful”。

如果你确定不使用goto,像

do {
...
while(0);

可能比 while(1) { ... } 更安全,因为它保证您不会无意中循环(如果您无意中循环,使用 while(1) 可能会无意中无限循环)。

为此目的(ab)使用 do/break/while 或 while/break 优于 goto 的一个优点是保证您不会跳到 构造之上 -- goto 可以是用于跳转到同一函数中较早的标签。

do/break/while 等相对于 goto 的缺点是你被限制在一个退出点(紧接在循环之后)。在某些情况下,您可能需要分阶段清理:例如,当您打开一个文件句柄、分配一些内存、从文件中读取...如果读取失败,您需要清理 malloc。如果 malloc 失败,则不需要清理,但仍然需要清理文件句柄。使用 goto,您可以在每个清理阶段使用一个标签,并根据错误发生的位置精确跳转到正确的点。

在我看来,因为对 GOTO 的普遍仇恨而盲目避免它比在个案基础上仔细推理出使用它的案例更具破坏性。我使用的一个经验法则是“Linux 内核会这样做吗?如果是的话,它不会那么坏”。用任何其他现代软件工程的好例子替换 linux 内核。

关于c - while(1) .. break 而不是 goto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1073397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com