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