代码之家  ›  专栏  ›  技术社区  ›  scope_creep

C到C定义宏的转换

  •  0
  • scope_creep  · 技术社区  · 15 年前

    您将如何将以下C定义转换为C_。

            #define get16bits(d) (*((const uint16_t *) (d)))
            #if !defined (get16bits)
            #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
                      +(uint32_t)(((const uint8_t *)(d))[0]) )
            #endif
    

    我知道你可能会用uint32替换uint32,uint32将其他类型改为c等价的,但是如何使上述方法成为静态方法。这是最好的方法吗?

    鲍勃。

    2 回复  |  直到 10 年前
        1
  •  2
  •   Jed Smith    15 年前

    我不知道你为什么要检查 get16bits 是在定义它之后立即定义的,因为唯一的方法是预处理器错误,它会停止编译。

    现在,也就是说,下面是你如何将这个可怕的宏转换为C:

    aNumber & 0xFFFF;
    

    实际上,下面是如何将宏转换为C的方法:

    a_number & 0xFFFF;
    

    你不需要所有这些铸造奇才,只需要得到一个数字的低16位。这里有更多的C定义来告诉你我在说什么:

    #define   getbyte(d)     (d & 0xFF)
    #define   getword(d)     (d & 0xFFFF)
    #define   getdword(d)    (d & 0xFFFFFFFF)
    #define   gethighword(d) ((d & 0xFFFF0000) >> 16)
    #define   gethighbyte(d) ((d & 0xFF00) >> 8)
    

    您真的在生产代码中使用了这个宏吗?

        2
  •  0
  •   Guffa    15 年前

    在C中,获得整数的低16位非常容易:

    int x = 0x12345678;
    short y = (short)x; // gets 0x5678
    

    如果您想要一个静态方法来完成它,那么它就很简单:

    public static short Get16Bits(int value) {
       return (short)value;
    }