1

私は、enum-switch-case で「default:」ラベルをスキップするのが大好きです。そのため、列挙型にスイッチケースで処理されない新しい値がある場合、コンパイラの警告が表示されます。

同僚は、列挙でカバーされていない整数をこの switch-case に渡すと、セグメンテーション違反が発生すると述べました。

少なくとも、使用している gcc は正しく処理します。また、Visual Studio のドキュメントには次のように書かれています。

これは標準であり、したがってすべての (または少なくともほとんどの) コンパイラの動作ですか?

4

3 に答える 3

3

MSコンパイラはそれを正しく行うようです。標準の内容は次のとおりです(6.4.2 / 5):

条件に一致するケース定数がなく、ラベルがある場合default、制御はラベルによってラベル付けされたステートメントに渡されdefaultます。一致するケースがなく、一致しない場合default、switch 内のステートメントは実行されません。

于 2012-11-26T08:47:21.417 に答える
1

スキップされた大文字と小文字がコードを壊した場合にのみ、セグメンテーション違反が発生する可能性があります。それ以外の場合、コンパイラは、セグメンテーション違反を生成するコードを発行するべきではありません。

フォルトを生成する例:

 switch(flag) {
     case Type1: p = malloc(200); break;
     case Type2: p = malloc(100); break;
 }
 memcpy(p, source, 10);
于 2012-11-26T08:47:02.523 に答える
0

[stmt.switch] の状態:

ケースが一致せず、デフォルトがない場合、switch 内のステートメントは実行されません。

そうです、VSはこの点で標準に従っています。

于 2012-11-26T08:48:30.300 に答える