【发布时间】:2010-11-07 14:05:33
【问题描述】:
我在一个 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 没有回答我的问题。
【问题讨论】:
-
为此使用 while(1) 会使阅读代码的人期望它“无限”运行...为什么不使用 do { } while(0) ?
-
@Tal Pressman - 为什么会有不同?
-
@Earwicker,使用该选项很明显它至少会运行一次,并且不会再次运行,因为条件是“while (0)”。不会出现令人困惑的“while(1)”。
-
但是两者都使用循环结构,其中没有任何循环的意图。两者都具有误导性、模糊性等。
-
@Earwicker:我同意,但更糟糕的是它暗示了无限循环。但是,对于一开始就不是循环的事物使用循环是糟糕设计的明显标志。