我有一个使用 union 将一系列字节转换为浮点数的函数。我用它来精确表示一些难以写出的数字,例如 NaN 和 Infinity。
float i2f(uint32_t i)
{
union { uint32_t i; float f; } u;
u.i = i;
return u.f;
}
我遇到的问题是我不能在需要常量表达式的地方使用这个函数,比如静态初始值设定项:// error: initializer element is not constant
float fs[2] = { i2f(0xffc00000), i2f(0x7f800000) };
是否有另一种方法可以实现相同的效果,使得结果表达式作为常量表达式有效?到目前为止,我发现将 NaN 表示为常量的唯一方法是使用 __builtin_nan扩展,不可移植。如果可能的话,我更喜欢在 C 标准范围内工作的东西。
最佳答案
C 标准没有在严格遵守的代码中提供任何特性,这些特性会为此产生一个整数常量表达式。
我们可以得到的最接近的可能是创建一个复合文字并获取其中的一个成员:
(union { uint32_t u; float f; }) { 0xffc00000} .f
然而,这不是 C 标准定义的常量表达式,除了 C 2018 6.6 10 说“一个实现可以接受其他形式的常量表达式”。可以满足您的目的只是定义包含所需值的 union :
union { uint32_t u; float f; } fs[2] = { { 0xffc00000} , { 0x7f800000 } };
之后你会使用他们的成员,fs[0].f
, fs[1].f
, 等等。
关于c - 是否可以在 C 常量表达式中进行 union 类型双关语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68674919/