4

VS2005 のように、すべてのコンパイラが switch ステートメントのラベルの前のコードを静かに無視するかどうか疑問に思っています。

これが私が求めているものです:

#define CASE break; case

そう、

switch (i) {
  CASE 0:  print("0");
  CASE 1:  print("1");
}

に変わるだろう

switch (i) {
  break;
  case 0:  print("0");  break;
  case 1:  print("1");
}

標準から、最初の「ブレーク」(および存在する場合は他のコード) が実行されないことは明らかです。標準はそのようなコードの存在を否定していませんが、実際のコンパイラについては確信が持てません。

4

2 に答える 2

4

はい、これは §6.4.2¶5 (特に無視する部分) で暗示されています。

switch ステートメントが実行されると、その条件が評価され、各ケース定数と比較されます。ケース定数の 1 つが条件の値と等しい場合、一致したケース ラベルの後のステートメントに制御が渡されます。条件に一致するケース定数がなく、デフォルト ラベルが存在する場合、制御はデフォルト ラベルでラベル付けされたステートメントに渡されます。ケースが一致せず、デフォルトがない場合、switch 内のステートメントは実行されません。

ただし、あなたのマクロは良い考えではないと思います。

于 2012-09-03T22:26:35.177 に答える
1

個人的には、すべての警告がエラーに変わり、到達不能コード警告が発生する可能性が高いため、そのようなコードを書くことは「できません」...そして実際、clang ++のクイックテストではそのような警告が出力されます。

于 2012-09-03T22:28:38.687 に答える