【问题标题】:Non-constant storage size for autoconf check involving floats?涉及浮点数的自动配置检查的非常量存储大小?
【发布时间】:2013-01-07 16:42:11
【问题描述】:

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

效果很好。

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

为什么第一个失败了?

【问题讨论】:

  • 显然第二个版本可以在编译时解析为常量,但第一个不能。
  • @VladLazarenko 更新以使这一点更加清晰

标签: c gcc floating-point autotools autoconf


【解决方案1】:

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

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

(强调我的)。

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

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

不是整数常量表达式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多