【发布时间】:2021-02-08 03:22:18
【问题描述】:
使用 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。
【问题讨论】:
-
是常量整数和整型常量的区别。 Clang 在接受代码时不遵循 C 标准。每个编译器都使用了哪些编译选项?
-
我对两者都使用相同的选项:
cc -xc -(我的cc是 Clang)和gcc-10 -xc -。 -
AFAIK,当您没有另外指定时,GCC 10 有效地使用
-std=gnu11进行编译。 (我不认为它使用 C18,并不是说它会有很大的不同。)我注意到您尚未确定您使用的是哪个版本的 Clang。它可能遵循不同的标准。它可能使用了不同的 GCC 兼容性假设。 -
@JonathanLeffler 我已经编辑了我的问题以包含版本信息。
-
如果您以一致模式调用编译器,则必须进行诊断(否则它是编译器错误),例如使用
-std=c11 -pedantic(或任何标准版本)
标签: c gcc switch-statement clang