为什么大神级程序的C语言代码里到处都是goto?

来源(Web开发者)

From: http://www.admin10000.com/document/3684.html

为什么大神级程序的C语言代码里到处都是goto?

来源:WEB开发者 发布时间:2014-01-09 阅读次数:679

当我学C语言时,老师整天告诉我:“不要使用goto, 这是一个坏习惯, 这种写法很烂,而且很危险!”等等。

但是为什么那么多内核程序员那么喜欢用goto呢?在这段linux内核 https://github.com/torvalds/linux/blob/master/kernel/sched/clock.c 代码里,我觉得可以用简单的一个while替换掉,如:

while(condition) {
}
//或
do {
} while(condition);


注*这段代码来自torvalds的linux内核代码,其实不仅可以使用while,还有很多地方可以使用if () {} else {} 的结构代替,很多内核的其他文件也是如此,如 fs.open http://lxr.linux.no/linux+v3.12.6/fs/open.c#L464

对此我很不理解,在某些情况下使用goto比while/do-while好吗?如果是的话,为什么呢?

by: musicmatze

回答一:

对于这个例子中,我估计是从原来SMP不安全(non-SMP-safe)的方式改成SMP的方式。使用goto语句对原来的代码改动量最小,引起潜在风险的概率最小。

我其实也不赞成你们用这种方式,但我认为绝对不要使用goto也是一种误导。在一个只会向前走,绝不会后退的函数里,使用goto绝对不会引起死循环,而且这种方式绝对是最简单最清楚的跳转方式。(如通过在清理代码和返回错误时使用)

by: R..

回答二:

历史:我们也许记得Dijkstra 在1968年写的 Goto Considered Harmful http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html, 现在快半个世纪过去了。外面已经很少看到goto了。

不过我们来分析一下这个例子,一个关于错误处理的,让我们用结构化的语法来写:

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


那么,换成goto呢?

if (do_something() == ERR)  // 一行
    goto error;             // |
if (do_something2() == ERR) // |
    goto error;             // |
if (do_something3() == ERR) // |
    goto error;             // V
if (do_something4() == ERR)   // 使用普通的平铺形式
    goto error;


我们看到这段代码都是平级的,不相互依辣的,明显goto的结构更好。

by: Dietrich Epp

原文 stackoverflow.com

Link: http://www.asm32.net/article_details.aspx?id=5992


浏览次数 0 发布时间 2014/1/9 15:35:52 从属分类 CODE 【评论】【 】【打印】【关闭
 
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | Python | 书签 | ASP.Net书签 | 京ICP备09029108号-1