大家都知道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; }
沒有留言:
張貼留言