为什么gcc不允许将const int作为case表达式?

时间:2009-11-11 02:55:08

标签: c objective-c compiler-construction const

我正在看这个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)满意。

1 个答案:

答案 0 :(得分:27)

常量表达式与const限定类型值不同,即使从技术上讲,编译器在case语句处知道该值。

想象一下,如果另一个文件声明extern const int FOO并尝试以相同的方式使用它会发生什么。编译器不知道FOO是什么,因为它是在另一个文件中定义的。即使它具有常量,它也不是常量表达式