“goto” in kernel

     Rules are for the guidance of wise men, and the obedience of fools.

————-   Douglas Bader

     很多教材上都强调不要使用goto,会让程序混乱逻辑不清。我突发奇想测试一下linux内核里有没有goto。方法:

grep goto * -r | wc -l

       在kernel 3.11.1中有110139个记录,我就吓了一跳。难道kernel的维护人员不知道这个常识。于是就搜索,发现早就有人提出过这个问题了。在linux today 一篇文章中就对此进行了讨论。

        其中有一句话让人幡然醒悟,”Rules are for the guidance of wise men, and the obedience of fools.” 规则指导智者,愚人服从规则。我是个愚人。看看上面的解释说:

 “No gotos” is a rule that makes sense in most circumstances. Great for protecting novices from shooting themselves in the foot. But to give another quote,

“The professional knows when to break the rules”. From my photography, I know that accidentally breaking the rules usually produces crap shots – stuff by people I call “snappers”. But deliberately breaking the rules can produce spectacular results.

 

       这个评论者很风趣,经常用俗语。他没有否定不能用goto的说法。但是不是一定不能用,“专业的知道什么时候该打破规则”.就像摄影一样,不小心打破规则就会出烂片,适时故意打破规则可以拍到惊艳的照片。果然我还是too naive.

      那么 什么时候该用goto呢?这个问题就好解决了,因为我已经知道goto是可以用的,而这个问题的由来是linux内核里出现很多goto,而linux内核是最牛的人在维护。那就直接看源码好了。下面的是随便截了一段代码。

 

       可以清晰的看出,goto在c语言中就是用来处理异常的。goto就非常方便,无需一步步退出反而让程序逻辑不清。大概就是这个意思。另外最近看了一点点汇编,发现goto应该是起源于汇编。

      综上,goto可以在处理异常等类似情况下使用,而用来模拟for while就是不应该的,确实会让程序混乱。