这段代码有什么作用?

Ham*_*Ham 7 c++

#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.

  • 在你的回答中是"+/- INF"吗?因为我很确定位模式只是`+ Inf` :-) (2认同)

sha*_*oth 6

上面的代码有效地定义了一个浮点常量,其中包含一些非常特定的字节表示.

每个float都用一组字节表示,但是当你定义float常量时,你被迫使用十进制表示,并且不能用值来定义一个常量0xFFFFFFFF(我不知道该常量是否是合法的float数字).

上面的代码绕过了这个限制 - 它首先在union中设置一个字节数组,然后"访问"相同的字节数组,就像它是一个float数字一样.顺便说一句,这是非法的 - 只有先前设置的工会成员才能合法访问,但它可能适用于该特定实现.