2010-06-03 104 views
1

可能重複:
Examples of good gotos in C or C++goto的可接受用途是什麼?

什麼goto語句,你認爲可以接受的使用?我正在討論一些關於C嵌入式工作的編碼指南,並想知道是否存在goto是最乾淨的方式來做事情的情況。

+0

關於這個問題的一個有趣的閱讀是D. D. Knuth的[結構化程序設計與語句](http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf)。它寫在1974年,但仍然包含有趣的例子和想法 – tonio 2010-06-03 16:20:03

回答

1

對於C語言,我發現在某些函數中使用goto作爲常用的退出點很有用。如果你需要在返回之前釋放資源,那麼很好做retval = -ERROR; goto fn_exit;而不是試圖擺脫多層for/while循環。

有些人會認爲在設計良好的代碼中沒有必要 - 當您達到使用goto的吸引力時,您應該將功能分解爲多個子功能。也許在某些情況下這是真的,但是如果你必須傳入多個變量,或者傳遞指向變量的指針,以便子函數可以更新這些值,我覺得你已經增加了不必要的複雜性。

以下是using goto for error management最近的SO問題。我確定瀏覽goto tag會給你更多的答案。

0

我發現有很多地方goto可能會簡化邏輯。我的規則是沒有兩個goto重疊,goto和它的標籤是'close';通常不超過30線。

通常,當我有一個複雜的條件是我要檢查很多東西,goto語句可能會幫助:

if (condition1 && cond2) 
    if (checkFile(file)) 
    goto DONE; 
else 
    if (condition3) 
    goto DONE; 

handleError(); 
return 0; 

DONE: 
...do something... 
return 1; 
+0

我可以想到更優雅的解決方案*沒有* goto,所以這不是一個強有力的論點。例如,創建一個函數'int done()',並用'return done()'替換'goto DONE'。幾乎總是有一種比訴諸goto更好的方法。 – Clifford 2010-06-03 16:51:59

+0

@Clifford你是對的,我上面的例子很簡單;但這是關鍵:我提出的goto的使用是針對複雜的邏輯,這很難通過一個簡單的例子來演示。現在,在一些複雜的問題中,我發現一個簡單的goto比其他解決方案的意圖更直接和明確。 – Gianni 2010-06-03 17:07:32

+0

@Clifford你是否在給定的函數中提出了多個return語句? – simon 2010-06-04 00:18:22

0

我個人的看法是,有goto語句沒有可接受的使用在現代編程語言。

Edsger W. Dijkstra所着的「GOTO聲明被認爲是有害的」,在解決這個問題方面做得很好。該文件應該被要求閱讀這個星球上的每個軟件開發者。

值得注意的是,20世紀70年代晚期UT奧斯汀Don Good小組的Gypsy語言並沒有啓動。

值得注意的是,Ichbiah等人僅在Ada中包含了一個goto,因爲DoD明確要求它在需求規範中的許多單詞中。我記得伊奇比和他的團隊故意將goto目標標籤的語法儘可能地醜化,使標籤像拇指一樣突出,並勸阻使用goto。