C语言 为什么Clang接受' static const '作为case标签,而GCC不接受?



使用Clang,这段代码可以很好地编译,没有错误和警告:

static const int ZERO = 0;
int main() {
switch (0) {
case ZERO: break;
}
}

但是使用GCC,我得到一个错误:

<source>: In function 'main':
<source>:5:9: error: case label does not reduce to an integer constant
5 |         case ZERO: break;
|         ^~~~

为什么?


注意:在这种情况下,我可以只使用#define,但我想知道为什么Clang和GCC的行为在这里有区别。

我正在使用Apple Clang 11.0.3(似乎是通过Xcode安装的)和GCC 10.2.0,但我能够在使用Clang主干和GCC主干的Godbolt上重现此问题。在本地和Godbolt中,我都使用x86-64。

这是在侧边栏:

switch case: error: case标签不归为整型常量

显然'const'在这种情况下不是一个常量表达式,而是一个常量变量…好吧,看看这篇文章就知道了。看来clang有不同的规则。这是在多个编译器上编译总是好的另一个原因。

最新更新