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