int value;
const int signalmin = some_function();
switch(value)
{
case signalmin:
break;
}
我读取some_function的值并使用该int值来执行切换操作。 C99编译器返回:
错误:case标签不会减少为整数常量
但是我不能使用#define,因为在交换机执行之前正在读取int值。
答案 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;
}