switch case:error:case标签不会减少为整数常量

时间:2012-12-28 12:41:42

标签: c

int value;

const int signalmin = some_function();

switch(value)
{
   case signalmin:
   break;
}

我读取some_function的值并使用该int值来执行切换操作。 C99编译器返回:

错误:case标签不会减少为整数常量

但是我不能使用#define,因为在交换机执行之前正在读取int值。

6 个答案:

答案 0 :(得分:45)

switch标签必须是常量表达式,必须在编译时进行评估。如果要对运行时值进行分支,则必须使用if

const - 限定变量不是常量表达式,它只是一个不允许修改的值。

整数常量表达式的形式详见6.6(6)[C99和C2011标准的n1570草案]:

  

6 整型常量表达式应具有整数类型,并且只能有操作数   它是整数常量,枚举常量,字符常量,sizeof   结果为整数常量,_Alignof表达式和浮点数的表达式   作为强制转换的直接操作数的常量。将运算符转换为整数常量   expression只能将算术类型转换为整数类型,除非作为一部分   sizeof_Alignof运算符的操作数。

只允许sizeof个结果为整数常量的sizeof表达式排除其操作数为可变长度数组的{{1}}表达式。

答案 1 :(得分:7)

让我参考一个例子。以下是在gcc版本4.6.3上进行了测试,并设置了标记-std=c99 -pedantic

#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块来执行此操作。

答案 2 :(得分:6)

在C.中,所有case标签必须是编译时常量。在C中,const限定符不会创建编译时常量,它只是指定运行时变量是只读的。

switch不适合您正在尝试的操作。

答案 3 :(得分:0)

在C中,变量不在开关案例标签中使用,而是只允许在那里使用常量表达式。

答案 4 :(得分: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

答案 5 :(得分:0)

我正在使用下面的代码并且它工作正常

case "+": 即用双引号引起错误 所以试着写

case '+':在单引号中

#include <stdio.h>

int main() {
    // Write C code here
    char x;
    int a=20,b=10;
    scanf("%c",&x);
    switch(x)
    {
        
    case '+':
            printf("%d",a+b);
            break;
    case '-':
            printf("%d",a-b);
            break;
    case '*':
            printf("%d",a*b);
            break;
    case '/':
            printf("%d",a/b);
            break;
    default:
            printf("sorry");
    }
    
    return 0;
}