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

我正在考虑这个问题,并开始考虑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中说明

每个case标签的表达式应为整数常量表达式,并且同一switch语句中的两个case常量表达式在转换后不应具有相同的值。

我理解为什么case表达式必须是常量,但不是为什么只有一个文字让编译器(gcc 4.2.1)满意。

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

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