我正在使用一些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都不是很熟悉,但这两个看起来似乎在编译时应该可以确定值。
为什么第一个失败?
答案 0 :(得分:6)
让我们看看标准(6.6(6)):
整型常量表达式应具有整数类型,并且只能有操作数 它是整数常量,枚举常量,字符常量,
sizeof
结果为整数常量,_Alignof
表达式和浮点数的表达式 作为强制转换的直接操作数的常量。 以整数常量转换运算符 表达式只能将算术类型转换为整数类型,除非作为一部分sizeof
或_Alignof
运算符的操作数。
(强调我的)。
您不能在整数常量表达式中转换为float
(sizeof
或_Alignof
的参数除外),因此
1 - 2 * !((((float)((int)((float)1.4))) == ((float)1.4)) >= 0)
不是整数常量表达式。
static
数组的元素数必须是求值为正整数的整数常量表达式。