我正在看这个SO question并且开始考虑const ints和#defines并且意识到我实际上并不理解为什么编译器无法解决这个问题。有人可以解释为什么以下代码
const int FOO = 10;
int main(int argc, char** argv)
{
switch(argc)
{
case FOO: { printf("foo\n"); }
default: { printf("default\n"); }
}
}
结果
error: case label does not reduce to an integer constant
我阅读了ISO-C99规范,该规范在6.8.4.2.3中说明了
每个案例标签的表达 应该是一个整数常量 表达并没有两个案例 常数表达式相同 switch语句应具有相同的 转换后的价值。
我理解为什么case表达式必须是常量,但不是为什么只有一个文字让编译器(gcc 4.2.1)满意。
答案 0 :(得分:27)
常量表达式与const限定类型值不同,即使从技术上讲,编译器在case
语句处知道该值。
想象一下,如果另一个文件声明extern const int FOO
并尝试以相同的方式使用它会发生什么。编译器不知道FOO
是什么,因为它是在另一个文件中定义的。即使它具有常量值,它也不是常量表达式。