次の 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
れているように、このコードでコンパイル エラーが発生するのはなぜですか?
次の 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
れているように、このコードでコンパイル エラーが発生するのはなぜですか?
C では、 aconst
は真のコンパイル時定数ではないためです。これは単なる読み取り専用オブジェクトです。この主題に関するC FAQがあります。
定数変数はまだ定数式ではありません。constexprs (一般に参照される) には、リテラルとコンパイル時の定数のみを含める必要があります。
理由:
1. const
switch ステートメントでは使用できません。ただし、を使用できます#define/enum
。このリンクを参照してください。
2.2break
番目の場合はありません。
3.ケースはありませんdefault
。
4. の後にはコロンが必要case
です。
これは、コードで変数を使用しているためです。caseステートメントで変数を使用することはできません。ここで、aは変数と見なされます
コンパイラは、効率的なバイナリツリーまたはジャンプテーブルを使用してcaseステートメントを評価することを明示的に許可されています。
このため、caseステートメントはコンパイル時定数です。
C99標準はこれを言います(そしてC89標準は非常に似ていました):
§6.8.4.2switchステートメント
制約
¶1switchステートメントの制御式は整数型でなければなりません。
[...]
¶3各caseラベルの式は整数定数式でなければならず、同じswitchステートメント内の2つのcase定数式が変換後に同じ値を持つことはできません。switchステートメントには最大で1つのデフォルトラベルが含まれる場合があります。