【问题标题】:Why does Clang accept `static const` as case label but GCC does not? [duplicate]为什么 Clang 接受 `static const` 作为 case 标签但 GCC 不接受? [复制]
【发布时间】: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


【解决方案1】:

这是在侧边栏中:

switch case: error: case label does not reduce to an integer constant

显然,在这种情况下,'const' 不是一个常量表达式,而是一个常量变量......好吧,请阅读帖子。似乎clang 有不同的规则。在多个编译器上编译总是好的另一个原因。

【讨论】:

  • 我还在侧边栏中看到了stackoverflow.com/questions/1712711/…,但我想了解更多关于为什么行为有所不同——GCC拒绝在全部,而 Clang 甚至没有发出警告。
  • @Camelid 在 Clang 中打开警告(或 -Werror 错误)也会导致它不被接受,说它是 GNU 扩展。
  • @Camelid 好点。现在我也想知道为什么会有差异。
  • @ThomasJager 我无法重现您所描述的内容。你传递了哪些标志以及传递到哪个版本的 Clang?
猜你喜欢
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2011-09-07
  • 2020-05-13
  • 1970-01-01
  • 2023-03-27
  • 2014-04-04
相关资源
最近更新 更多