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

问题描述 投票:0回答:1

我正在看这个SO问题,并开始思考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 表达式必须是常量,但不明白为什么只有文字才能让编译器(gcc 4.2.1)满意。

c objective-c gcc constants
1个回答
28
投票

常量表达式与 const 限定类型值不同,即使从技术上讲,编译器在

case
语句处已知该值。

想象一下,如果另一个文件声明

extern const int FOO
并尝试以相同的方式使用它,会发生什么。编译器不知道
FOO
是什么,因为它是在另一个文件中定义的。尽管它有一个常数,但它不是一个常数表达式

© www.soinside.com 2019 - 2024. All rights reserved.