2012-11-26 32 views
0

我非常喜歡在enum-switch-case中跳過「default:」標籤。所以我得到編譯器的警告,當枚舉有一個新的值,而不是交換機處理。沒有默認標籤的Switch-Case中的值無效

現在有個同事說,當將一個整數傳遞給這個沒有被枚舉所涵蓋的開關情況時,我會得到一個分段錯誤。

至少我們正在使用的gcc可以正確處理它。 Visual Studio documentation也是這樣說的:如果「沒有任何常量匹配case標籤中的常量並且不存在默認標籤>>>控制將在switch語句後傳輸到語句中。」

這是標準,因此是所有(或至少最多)編譯器的行爲?

+0

也許你的同事正在考慮案例表後面的代碼。如果它使用配置不正確的資源,那麼該表將以其他方式配置,那麼,是的,沒有默認值可能導致段錯誤。 –

回答

2

的MS編譯器,似乎這樣做的權利。這裏的標準說什麼(6.4.2/5):

如果任何情況下,固定的條件相匹配,如果有一個default標籤,控制 交給由default標籤標註的聲明。如果沒有大小寫匹配並且沒有default那麼交換機中的任何語句都不會執行。

1

只有在跳過的案例破壞了您的代碼時,它纔會導致分段錯誤。否則,編譯器不應該發出會產生分段錯誤的代碼。

的例子,就會產生故障:

switch(flag) { 
    case Type1: p = malloc(200); break; 
    case Type2: p = malloc(100); break; 
} 
memcpy(p, source, 10); 
+0

+1僅用於合法分段代碼的方式。 –

+0

@KarthikT:我認爲沒有任何「合法的方式來對代碼進行分段」,因爲語言中沒有段錯誤的概念。 Segfaults是做非法*的結果。 –

+0

好的,讓我詳細說明一下。 +1作爲符合法律/標準的情況的例子,可能在不久的將來導致分段錯誤。 –

0

[stmt.switch]狀態:

如果沒有匹配的情況下,如果沒有缺省,則執行無交換機的 語句。

所以是的,VS遵循這方面的標準。