C - 函数参数,如switch语句中的情况

时间:2014-10-10 14:56:11

标签: c gcc switch-statement

谷歌的标题有点过于模糊。

我发现自己计划多次编写这个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值的方式编译?

3 个答案:

答案 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语句。