【发布时间】:2014-10-10 14:56:11
【问题描述】:
标题对谷歌来说有点太模糊了。
我发现自己计划多次编写这个 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: 行上的“表达式必须有一个常量值”。现在,我知道我可以将其更改为一系列ifs,但我很感兴趣为什么这不起作用,或者是否有办法让它起作用。
switch 语句是否只是以无法将变量替换为 case 值的方式编译?
【问题讨论】:
-
是的,case标签必须是常量表达式。
-
不能在case表达式中使用变量!它必须保持不变!
-
它不起作用,因为规范不允许。
-
并且规范不允许这样做,因为它希望允许将 case 语句编译成比一系列条件分支更有效的实现。例如,基于跳转表的单个分支。 (一个特定的编译器实际上是否选择这样做是一个完全不同的问题。)
-
...不要忽视
expected == -1时的附加乐趣。
标签: c gcc switch-statement