1

次の C コードと混同しています。

int main()
{
 const int i=2;

 switch(2)
 {
   case 1:
     printf("this is case 1");
     break;
   case i:
     printf("it should be case 2");
 }

キーワードの後にcase​​定数式があるはずです。

定数として宣言さiれているように、このコードでコンパイル エラーが発生するのはなぜですか?

4

4 に答える 4

9

C では、 aconstは真のコンパイル時定数ではないためです。これは単なる読み取り専用オブジェクトです。この主題に関するC FAQがあります。

于 2012-09-06T15:51:39.827 に答える
2

定数変数はまだ定数式ではありません。constexprs (一般に参照される) には、リテラルとコンパイル時の定数のみを含める必要があります。

于 2012-09-06T15:51:56.373 に答える
2

理由:

1. constswitch ステートメントでは使用できません。ただし、を使用できます#define/enumこのリンクを参照してください。

2.2break番目の場合はありません。

3.ケースはありませんdefault

4. の後にはコロンが必要caseです。

于 2012-09-06T15:57:31.650 に答える
0

これは、コードで変数を使用しているためです。caseステートメントで変数を使用することはできません。ここで、aは変数と見なされます

コンパイラは、効率的なバイナリツリーまたはジャンプテーブルを使用してcaseステートメントを評価することを明示的に許可されています。

このため、caseステートメントはコンパイル時定数です。

C99標準はこれを言います(そしてC89標準は非常に似ていました):

§6.8.4.2switchステートメント

制約

¶1switchステートメントの制御式は整数型でなければなりません。

[...]

¶3各caseラベルの式は整数定数式でなければならず、同じswitchステートメント内の2つのcase定数式が変換後に同じ値を持つことはできません。switchステートメントには最大で1つのデフォルトラベルが含まれる場合があります。

于 2012-09-06T15:52:25.427 に答える