在C中为静态const double分配一个静态const unsigned long long int变量

时间:2018-06-23 06:34:45

标签: c gcc standards

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

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实验版则表示可以接受。

测试代码由想要了解其输入中“负数”的第三方工具生成。该工具生成一个简单的C代码,通过仅作为“ gcc”调用gcc将代码提供给gcc,并窥视标准错误。

随着gcc更改响应,至少从9.0开始,该工具显示回归。我想知道根据C标准哪个是正确的。该工具不必依赖于特定的gcc编译器。编译器可以是clang,icc,Visual Studio,Sun Studio或任何损害C标准的文件。

1 个答案:

答案 0 :(得分:3)

neg不是根据C11标准的算术常数表达式。 (C ++会将其视为一个常数。)在此特定领域中,一直有人在讨论如何使C与C ++保持一致,但这不是已发布标准的一部分。

但是,允许实现将初始表达式中的其他表达式作为常量表达式接受,因此允许它们接受此构造。