2011-08-04 29 views
1

我可以使用類似的Java類finally從句在C開關。我的大部分案例都有一套共同的功能,我希望將一個案例放在一起。我正在考慮使用goto語句來實現這個功能,並且非常瞭解goto代碼混淆能力,將共享案例放在switch語句的底部,似乎是一種「乾淨」的方式,而不是將共享功能劃分爲單獨的功能。最終條款(可能使用GOTO)

反正,我一直在試圖做這樣的事情:

switch(x) { 
case 0: 
    printf("Case 0\n"); 
    goto case 2; 
    break; 
case 1: 
    printf("Case 1\n"); 
    goto case 2; 
    break; 
case 2: 
    printf("Case 2\n"); 
    break; 
default: 
    // do nothing 
    break; 
} 

然而,使用gcc,這個失敗,錯誤

error: expected identifier or ‘*’ before ‘case’ 

如何使工作有什麼建議?或者可能更好的方法?

回答

4

「最佳實踐」當然是共享碼委託給一個函數。但是,在這過度設計,或者根本不可能/可取某些情況下,那麼你可以做:

switch(x) 
{ 
case 0: 
    printf("Case 0\n"); 
    goto shared_material; 

case 1: 
    printf("Case 1\n"); 
    goto shared_material; // Unnecessary, but keep it for clarity. 

case 2: 
shared_material: 
    printf("Case 2\n"); 
    break; 

default: 
    // Write a meaningful error message somewhere 
    return -1; 
} 

我不覺得這太不可讀,和我沒有任何與它的問題,提供整個陳述適合於一個屏幕(否則它符合意大利麪代碼)。然而,你可能不得不在代碼評論中捍衛它,這是我將離開這樣的構造並重新思考代碼的主要原因之一。

+0

好了,這個工程。我只是覺得case語句是switch語句內部的標籤。 – Kenneth

+0

@Kenneth:不在C中。他們在C#中(可能在Java中),因爲C#不允許你通過'case'語句,所以你使用'goto',在C中你會使用'/ /通過評論。 –

+0

在生成的代碼中,它們的行爲與標籤相似,但在C語言中,它們不是。 –

2

爲什麼不把公共代碼開關後?

我覺得我有更新這個答覆,有一個意譯接受的答案,我覺得有一個更好的設計:

switch(x) 
{ 
    case 0: 
     printf("Case 0\n"); 
     break; 

    case 1: 
     printf("Case 1\n"); 
     break; 

    case 2: 
     break; 

    default: 
     return -1; 
} 

printf("Common code for cases 0, 1 and 2\n"); 

或者,你當然可以在「默認」的情況下設置一個標誌,那會如果由於某種原因不希望將其分解爲單獨的函數,則可以防止執行通用代碼。

+0

我忘了提,只是某些情況下需要共享代碼。 – Kenneth

+0

然後它不像javas'_finally_ ;-)那樣工作我也更新了我的答案以顯示我的意思 – Christoffer

+0

是真的。最後只適用於例外情況。也許應該改寫原來的問題。 – Kenneth

1

你可以使用一個標誌do2,如果需要將其設置和開關後檢查。

如果是更復雜了許多層次的依賴關係,然後建立一個狀態機轉換。

1

我寧願去爲這種做法:

void sharedFunction() { 
    printf("Case 2\n"); 
} 

switch(x) { 
case 0: 
    printf("Case 0\n"); 
    sharedFunction(); 
    break; 
case 1: 
    printf("Case 1\n"); 
    sharedFunction(); 
    break; 
case 2: 
    sharedFunction(); 
    break; 
default: 
    // do nothing 
    break; 
} 
+0

我知道這是做到這一點的「正確方式」,但這似乎讓我感到混亂,因爲這種情況下的共享代碼不過是少數幾行。 – Kenneth

+0

功能可能有多短是沒有限制的。 :) – Johan

+0

@Kenneth:我也不喜歡它。當你想添加依賴局部變量的共享內容時,你必須添加一個參數到'sharedFunction',從而在3個不同的地方更改代碼。 「goto」方法在這方面更勝一籌。乾淨的解決方案應儘可能遠離'switch'結構。 –

1

以下工作:

switch(x) { 
case 0: 
    printf("Case 0\n"); 
    if(0) 
case 1:{ 
    printf("Case 1\n"); 
    } 
case 2: 
    printf("Case 2\n"); 
    break; 
default: 
    // do nothing 
    break; 
} 
+1

我印象深刻。我永遠不會想出這個,我不願意維護包含這個的代碼,但我留下深刻的印象。 – Kenneth

+0

@Kenneth,將所有'case'語句包裝在'{}'中是一個好習慣(在這裏你應該把它們全部包裝在'{}''中)。我正在做的只是放一個'if(0)'。至少避免使用'goto'。 – iammilind

+0

但是,此解決方案僅適用於單個案例聲明。 – Kenneth