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
其操作数是可变长度数组的表达式.
让我参考一个例子.以下是在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
块来做到这一点.
在C.所有case
标签必须是编译时间常量.在C中,const
限定符不会创建编译时常量,它只是指定运行时变量是只读的.
switch
对于您正在尝试的内容,A 不是合适的控制结构.