#ifndef INFINITY
#ifdef _MSC_VER
union MSVC_EVIL_FLOAT_HACK
{
unsigned __int8 Bytes[4];
float Value;
};
static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}};
#define INFINITY (INFINITY_HACK.Value)
#endif
Run Code Online (Sandbox Code Playgroud)
我现在开始使用Chipmunk物理引擎,并在头文件中找到它
INFINITY用于为对象设置无限动量,但我不明白上面的代码是做什么的!
Jim*_*uck 15
它将INFINITY设置为由十六进制位0x7f800000表示的浮点值,即+INF.Visual Studio由于某种原因未定义INFINITY.
上面的代码有效地定义了一个浮点常量,其中包含一些非常特定的字节表示.
每个float都用一组字节表示,但是当你定义float常量时,你被迫使用十进制表示,并且不能用值来定义一个常量0xFFFFFFFF(我不知道该常量是否是合法的float数字).
上面的代码绕过了这个限制 - 它首先在union中设置一个字节数组,然后"访问"相同的字节数组,就像它是一个float数字一样.顺便说一句,这是非法的 - 只有先前设置的工会成员才能合法访问,但它可能适用于该特定实现.