大家都知道goto對程式碼是有害的,會造成程式碼難以被看懂。不過goto並不完全沒有用,有些情況使用goto會讓程式碼看起來比較清楚。
錯誤處理
由於C的語法沒有例外處理,在處理錯誤時有很多種寫法,我個人覺得使用goto的這個寫法的可讀性比較好。這也是目前我唯一想到適合使用goto地方,你可以在Linux kernel的程式碼中時常看到這種用法:
void foo()
{
if (!doA())
goto exit;
if (!doB())
goto error;
if (!doC())
goto error;
/* everything has succeeded */
return;
error:
/* error recovering */
exit:
return;
}
另一個常用的範例是用來release resource,以下程式碼當檢查vector中的資料是錯誤時,會使用goto跳到release resource的程式碼。
double sum_vector(double *vector1, double *vector2, int *error) {
double sum = 0;
*error = 1;
if(!checkVectorValid(vector1)) goto invalidVector;
if(!checkVectorValid(vector2)) goto invalidVector;
/* sum of vectors */
*error = 0;
invalidVector:
free(vector1);
free(vector2);
return 0;
}
沒有留言:
張貼留言