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

int value; const int signalmin = some_function(); switch(value) { case signalmin: break; } 

我读取some_function的值并使用该int值来执行切换案例。 C99编译器回馈:

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

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

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

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

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

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

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

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

对于您正在尝试的操作, switch不是合适的控制结构。

让我参考一个例子。 以下是在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块来执行此操作。

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

在OSX上,clang似乎将常量作为案例标签而没有抱怨。

 #include  #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