C 中使用 goto 会被打吗?

2018-11-28 19:21:30 +08:00
 codechaser

突发奇想,C 中的 goto 和我以前学的单片机里的汇编跳转好像,感觉很强大啊。假如大型项目里使用 goto 会被打吗?

11003 次点击
所在节点    C
102 条回复
chainmon
2018-11-28 22:45:30 +08:00
竟然存在 goto 为什么不能用?
ruimz
2018-11-28 23:01:45 +08:00
最近因为课程要求在看 Linux2.4.*的 kernel。许多函数,例如 fork,就用了 goto,应对复杂的情况
t6attack
2018-11-28 23:02:54 +08:00
体制内计算机系教育,最开始学编程时(大学 C 语言基础课),老师就教导大家,不要使用 goto,因为它会破坏代码的结构性。
然后,打开 linux 源码,到处都是 goto。
catror
2018-11-28 23:07:13 +08:00
别用的太飘逸就好了
VDimos
2018-11-28 23:09:47 +08:00
众所周知,c/c 艹里面是没有 goto 关键字的
xupefei
2018-11-28 23:11:04 +08:00
goto 性能超高,但是需要手动维护堆栈和寄存器。
如果上下文非常清晰(比如明显不会造成内存泄漏),那么用 goto 没啥不好的。
ryd994
2018-11-29 04:07:04 +08:00
@t6attack
@ruimz
@Android2MCU

Linux 里使用 goto 是有明确规则的
https://www.kernel.org/doc/html/v4.10/process/coding-style.html#centralized-exiting-of-functions
楼主是想把 goto 当 JMP 指令用到处乱飞
乱飞 100%被打死,不出两个月自己就想打死自己
ryd994
2018-11-29 04:11:13 +08:00
据我所知,Linux 里用 goto 但不是 cleanup 的只有一处,就是 CPU scheduler。这里可以用,是因为 CPU scheduler 逻辑很复杂,但又必须保证高性能。可读性已经无所谓了,反正本来就没几个人看得懂 /敢修改。
Android2MCU
2018-11-29 07:08:56 +08:00
@ryd994 这样子的话,真是被打死都不多
Akiyu
2018-11-29 08:07:08 +08:00
慎用 goto
bobuick
2018-11-29 08:27:50 +08:00
goto 适用的时候代码更可读。 写 golang 也偶尔会用,有时候没有 goto 可能就拆下写成递归才行
xxgirl2
2018-11-29 08:28:54 +08:00
一个函数里一堆 open、alloc 随便炸一个要保证不泄露用 goto 就方便。其他情况尽量避免。
多重循环、递归展开之类的大神级玩法用好 goto 会让代码更清晰。

把 C 当汇编写迟早会自杀的🙃。
gesaint
2018-11-29 08:53:22 +08:00
当然不会,总有适合它的地方
BOYPT
2018-11-29 08:56:32 +08:00
C 里面做异常处理时候 goto 是很合适的呀
看 nginx 源码里面的 goto 多舒服。
haon
2018-11-29 09:00:17 +08:00
我校 c 语言考试明确规定不能用 goto
turi
2018-11-29 09:16:50 +08:00
我从来没用过 goto
aihidao
2018-11-29 09:21:40 +08:00
@VDimos ?额?

我前几个月前接到过有 goto 的 c++项目。
Gempty
2018-11-29 09:23:17 +08:00
我肯定是往死打~~
Vegetable
2018-11-29 09:32:07 +08:00
合理使用...当然了,编写合理的代码对一些人来说是很难的,所以只能编写不合理但是更不容易出错的代码.
无论是 linux 还是 nginx,团队平均 coding 能力都自不必说,当然能驾驭好手里的工具.
如果对你司实力水平有信心,当然可以用更跳脱的工具.
liuxu
2018-11-29 09:36:04 +08:00
@ryd994

大家都流传“ goto 有害,禁止 goto ”,代码里任何时候都不要用 goto,所以我举了一个反例

写汇编也不会 goto/jmp 满天飞,都是跳到 ret 前恢复栈指针的代码,或者和 break 同义

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/512453

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX