42
int value;

const int signalmin = some_function();

switch(value)
{
   case signalmin:
   break;
}

some_function の値を読み取り、その int 値を使用してスイッチ ケースをオンにします。C99 コンパイラは以下を返します。

エラー: ケース ラベルが整数定数に縮小されません

しかし#define、スイッチが実行される前に int 値が読み取られているため、a を使用できません。

4

6 に答える 6

57

switchラベルは定数式でなければならず、コンパイル時に評価する必要があります。実行時の値で分岐したい場合は、if.

修飾されたconst変数は定数式ではなく、単に変更できない値です。

整数定数式の形式は、6.6 (6) [C99 および C2011 標準の n1570 ドラフト] で詳しく説明されています。

6整数定数式は、整数型を持ち、整数定数、列挙定数、文字定数、sizeof 結果が整数定数である式、_Alignof式、およびキャストの即値オペランドである浮動定数であるオペランドのみを持つものとします。整数定数式のキャスト演算子は、sizeofor_Alignof演算子のオペランドの一部を除き、算術型を整数型にのみ変換します。

sizeof結果が整数定数である式のみが許可されるという制限によりsizeof、オペランドが可変長配列である式は除外されます。

于 2012-12-28T12:45:01.680 に答える
16

例を挙げて説明しましょう。4.6.3以下は、フラグ-std=c99 -pedanticが設定された gcc バージョンでテストされました。

#define SOME_HARDCODED_CONSTANT 0 //good
int foo(int i, int b){
    const int c=0; //bad
    int a=0; //bad

    switch(i){
        case c:     //compile error
        case a:     //compile error.
        case (b+a): //compile error
        case SOME_HARDCODED_CONSTANT: //all good
        case 5: //all good
    }
}

他の人が指摘したように、case引数は実行時に評価できません。if-elseそのためにブロックを使用します。

于 2013-12-03T10:09:19.100 に答える
8

C. では、すべてのcaseラベルはコンパイル時の定数でなければなりません。C では、const修飾子はコンパイル時の定数を作成せず、ランタイム変数が読み取り専用であることを指定するだけです。

Aswitchは、あなたがやろうとしていることに対する適切な制御構造ではありません。

于 2012-12-28T12:45:10.230 に答える
0

C では、switch case ラベルで変数を使用することはできませんが、定数式はそこでのみ使用できます。

于 2012-12-28T12:48:43.813 に答える
0

OSX では、clang は問題なく定数をケース ラベルとして使用するようです。

#include <stdio.h>

#define SOME_HARDCODED_CONSTANT 0 //good for sure
int foo(int i, int b){ 
    const int c=1; //no problem!!!

    switch(i){
        case SOME_HARDCODED_CONSTANT: //all good
            printf("case SOME_HARDCODED_CONSTANT\n"); break;
        case c:     //no compile error for clang
            printf("case c\n"); break;
        case 5: //all good
            printf("case 5\n"); break;
    }   
    return i+b;
}

int main() {
    printf("test foo(1,3): %d\n", foo(1,3));
}

出力:

$> cc test.c -o test; ./test 
case c
test foo(1,3): 4
于 2014-09-01T00:37:14.720 に答える