使用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
有不同的规则。这是在多个编译器上编译总是好的另一个原因。