在 C 中使用 static const unsigned long long int 变量分配 static const double

Assigning static const double with a static const unsigned long long int variable in C

我想从简化的测试用例开始:

const unsigned long long int neg = (const unsigned long long) -1;

#line 1 "not-num-const"
void __cgo_f_1_4(void) { static const double __cgo_undefined__4 = (neg); }

长话短说,根据C标准,那是编译错误、有效代码还是未定义?或者,默认使用的 C 标准变得不同了吗?

gcc 7.3 说这是一个错误,而截至 6 月初的 gcc 9.0 实验版说这是可以接受的。

测试代码由第三方工具生成,该工具希望在其输入中了解 "neg"。该工具生成一个简单的 C 代码,通过调用 gcc 将代码提供给 gcc "gcc," 并查看标准错误。

由于 gcc 改变了响应,至少从 9.0 开始,该工具显示回归。我想知道根据 C 标准哪个是正确的。该工具不一定依赖于特定的 gcc 编译器。编译器可以是 clang、icc、Visual Studio、Sun Studio 或任何与 C 标准妥协的编译器。

根据 C11 标准,

neg 不是算术常量表达式。 (C++ 会将其视为常量。)有人讨论过要在这个特定领域使 C 与 C++ 更加一致,但这不是已发布标准的一部分。

但是,允许实现在初始值设定项中接受更多表达式作为常量表达式,因此允许它们接受此构造。