功能参数作为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语句。

链接地址: http://www.djcxy.com/p/84391.html

上一篇: Function parameter as case in switch statement

下一篇: Function error 'expected expression before char'?