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 不是合适的控制结构.
| 归档时间: |
|
| 查看次数: |
62113 次 |
| 最近记录: |