2

我正在使用一些 autoconf 的东西,并且有一个测试包括以下内容:

static int test_array [1 - 2 * !((((float)((int)((float)1.4))) == ((float)1.4)) >= 0)];

这失败了:

错误:“test_array”的存储大小不是恒定的

但是当我将其更改为:

static int test_array [1 - 2 * !((((int)((int)((int)1.4))) == ((int)1.4)) >= 0)];

它工作正常。

我对自动工具使用的所有技巧都不是很熟悉,但这两种方法对我来说似乎都应该在编译时确定。

为什么第一个失败?

4

1 回答 1

6

让我们看一下标准(6.6(6)):

整数常量表达式应具有整数类型,并且应仅具有整数常量、枚举常量、字符常量、sizeof 结果为整数常量的_Alignof表达式、表达式和作为强制类型转换的直接操作数的浮点常量的操作数。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,但作为sizeofor_Alignof运算符的操作数的一部分除外。

(强调我的)。

您不能float在整数常量表达式中强制转换为(除了sizeofor的参数_Alignof),因此

1 - 2 * !((((float)((int)((float)1.4))) == ((float)1.4)) >= 0)

不是整数常量表达式。

数组元素的数量static必须是一个整数常量表达式,计算结果为正整数。

于 2013-01-07T16:46:43.597 回答