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

Jim*_*nts 33 c

int value;

const int signalmin = some_function();

switch(value)
{
   case signalmin:
   break;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dan*_*her 49

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

const-qualified变量不是常量表达式,它仅仅是你不允许修改的值.

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

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

sizeof允许结果为整数常量的表达式的限制排除sizeof其操作数是可变长度数组的表达式.


rat*_*ath 8

让我参考一个例子.以下是在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
    }
}
Run Code Online (Sandbox Code Playgroud)

正如其他人所指出的那样,case无法在运行时评估参数.使用if-else块来做到这一点.


Joh*_*ode 7

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

switch对于您正在尝试的内容,A 不是合适的控制结构.