涉及浮动的autoconf检查的非恒定存储大小?

时间:2013-01-07 16:42:11

标签: c gcc floating-point autotools autoconf

我正在使用一些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)];

它工作正常。

我对autotools使用的所有hack都不是很熟悉,但这两个看起来似乎在编译时应该可以确定值。

为什么第一个失败?

1 个答案:

答案 0 :(得分:6)

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

  

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

(强调我的)。

您不能在整数常量表达式中转换为floatsizeof_Alignof的参数除外),因此

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

不是整数常量表达式。

static数组的元素数必须是求值为正整数的整数常量表达式。