3 回答
TA贡献1817条经验 获得超6个赞
switch标签必须是常量表达式,必须在编译时对其求值。如果要分支运行时值,则必须使用if。
- const限定变量不是常量表达式,它只是一个不允许修改的值。
6.6(6)[C99和C2011标准的n1570草案]中详细说明了整数常量表达式的形式:
6 整数常量表达式应具有整数类型,并且仅应具有整数常量,枚举常量,字符常量,sizeof 结果为整数常量的_Alignof表达式,表达式和浮点常量(它们是强制转换的立即数)的操作数。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为sizeofor _Alignof运算符的一部分。
仅sizeof允许结果为整数常量的表达式的限制排除了sizeof其操作数为可变长度数组的表达式。
TA贡献1829条经验 获得超6个赞
让我举例说明。在设置4.6.3了标志的gcc版本上测试了以下内容-std=c99 -pedantic:
#define SOME_HARDCODED_CONSTANT 0 //good
int foo(int i, int b){
const int c=0; //bad
int a=0; //bad
switch(i){
case c: //compile error
case a: //compile error.
case (b+a): //compile error
case SOME_HARDCODED_CONSTANT: //all good
case 5: //all good
}
}
正如其他人指出的那样,case无法在运行时评估参数。使用一个if-else块来做到这一点。
TA贡献1821条经验 获得超4个赞
在OSX上,clang似乎将常量用作大小写标签,而不会产生抱怨。
#include <stdio.h>
#define SOME_HARDCODED_CONSTANT 0 //good for sure
int foo(int i, int b){
const int c=1; //no problem!!!
switch(i){
case SOME_HARDCODED_CONSTANT: //all good
printf("case SOME_HARDCODED_CONSTANT\n"); break;
case c: //no compile error for clang
printf("case c\n"); break;
case 5: //all good
printf("case 5\n"); break;
}
return i+b;
}
int main() {
printf("test foo(1,3): %d\n", foo(1,3));
}
输出:
$> cc test.c -o test; ./test
case c
test foo(1,3): 4
- 3 回答
- 0 关注
- 1096 浏览
添加回答
举报