谷歌的标题有点过于模糊。
我发现自己计划多次编写这个switch语句,所以我想将它移动到一个函数中。
我要做的是创建一个函数,它接受一个值,你期望值的值,以及值的字符串标识符。
bool checkValue(int value, uint8_t expected, char * id) {
switch (value) {
case expected:
return true;
case -1:
printf("Error: Timeout on %s\r\n", id);
default:
printf("Error: %s=%02x\r\n", id, value);
return false;
}
}
编译器抱怨case expected:
行上的“表达式必须具有常量值”。现在,我知道我可以将其更改为一系列if
s但我感兴趣的是为什么这不起作用,或者是否有办法让它工作。
switch语句是否只是以一种不可能将变量替换为case值的方式编译?
答案 0 :(得分:3)
编译器错误几乎告诉你它为什么被禁止。它包含在6.4.2 [stmt.switch]中:
2条件应为整数类型,枚举类型或a 一个非显式转换函数的类类型 存在整数或枚举类型(12.3)。 [...]任何声明 switch语句可以用一个或多个case标签标记为 如下:
case constant-expression :
其中常量表达式应为转换常量表达式 (5.19)提升类型的切换条件。没有两个 同一个开关中的case常量后面应该有相同的值 转换为提升类型的切换条件。
答案 1 :(得分:3)
你做不到。 switch
语句要求所有case
值都是显式常量表达式 - 直观地说,表达式的值只能通过查看它们来确定。
这实际上是一个功能:当我看到switch
时,我立即知道控制流不依赖于运行时值。如果值在运行时更改,则使用不同的习惯用法,继续条件:
if(value == expected) {
return true;
} else if(value == -1) {
printf("Error: Timeout on %s\r\n", id);
return false;
} else {
printf("Error: %s=%02x\r\n", id, value);
return false;
}
答案 2 :(得分:0)
这只是C的要求。value
必须保持不变。只需将case
更改为if-elseif-else
语句。