2014年5月7日 星期三

[C]適合使用goto的時機

大家都知道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;
}

沒有留言:

張貼留言