c - 为什么有些内核程序员使用 goto 而不是简单的 while 循环?

标签 c linux loops linux-kernel goto

我学C的时候,老师整天跟我说:“不要用goto,那是个坏习惯,很丑,很危险!”等等。

那么,为什么有些内核程序员会使用goto,例如in this function , 可以用一个简单的

代替
while(condition) {} 

do {} while(condition);

我无法理解。在某些情况下使用 goto 代替 while/do-while 会更好吗?如果是这样,为什么?

最佳答案

历史背景:我们应该记住 Dijkstra 写了 Goto Considered Harmful 在 1968 年,当时很多程序员使用 goto 作为 structured programming 的替代品。 (ifwhilefor 等)。

44 年过去了,在野外很难找到这种 goto 的用法。很久以前,结构化编程就已经赢了。

案例分析:

示例代码如下所示:

    SETUP...
again:
    COMPUTE SOME VALUES...
    if (cmpxchg64(ptr, old_val, val) != old_val)
        goto again;

结构化版本如下所示:

SETUP...
do {
    COMPUTE SOME VALUES...
} while (cmpxchg64(ptr, old_val, val) != old_val);

当我看到结构化版本时,我立即想到,“这是一个循环”。当我查看 goto 版本时,我认为它是一条直线,末尾有一个“重试”案例。

goto 版本在同一列上同时具有 SETUPCOMPUTE SOME VALUES,这强调了大多数情况下,控制流通过通过两者。结构化版本将 SETUPCOMPUTE SOME VALUES 放在不同的列上,强调控制可能以不同的方式通过它们。

这里的问题是你想在代码中强调什么样的重点?您可以将此与 goto 进行比较以进行错误处理:

结构化版本:

if (do_something() != ERR) {
    if (do_something2() != ERR) {
        if (do_something3() != ERR) {
            if (do_something4() != ERR) {
                ...

转到版本:

if (do_something() == ERR)  // Straight line
    goto error;             // |
if (do_something2() == ERR) // |
    goto error;             // |
if (do_something3() == ERR) // |
    goto error;             // V
if (do_something4() == ERR) // emphasizes normal control flow
    goto error;

生成的代码基本相同,因此我们可以将其视为排版问题,例如缩进。

关于c - 为什么有些内核程序员使用 goto 而不是简单的 while 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13001067/

相关文章:

c - GtkStatusIcon绘图问题

linux - 如何在 Git 中设置权限?

android - Android 上的 TCP FAST OPEN

JavaScript - 数组 "undefined"错误

c - 如何浏览C源代码?

c - Linux,kprobes/kretprobes : a way to recover [from registers?] 探测函数的参数?

C 私有(private)变量 Get 和 Set 方法

linux - BeagleBoard Narcissus 工具链与 OpenCv 问题

c - 确保船只不重叠

Java - 使用嵌套 for 循环打印未填充的菱形