我想从简化的测试用例开始:
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标准的文件。
答案 0 :(得分:3)
neg
不是根据C11标准的算术常数表达式。 (C ++会将其视为一个常数。)在此特定领域中,一直有人在讨论如何使C与C ++保持一致,但这不是已发布标准的一部分。
但是,允许实现将初始表达式中的其他表达式作为常量表达式接受,因此允许它们接受此构造。