#define宏的C到C#转换

时间:2009-11-01 01:21:49

标签: c# c c-preprocessor

您如何将以下C #define转换为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_t,它将UInt32的其他类型更改为c#equivalent,但是如何从上面的静态方法开始。这是实现这一目标的最佳方式。

鲍勃。

2 个答案:

答案 0 :(得分:2)

我不知道你为什么要在确定get16bits之后立即查看aNumber & 0xFFFF; ,因为它不会是一个预处理程序错误,它会阻止你的编译。

现在,那就是说,这就是你如何将那个神圣的宏转换为C#:

a_number & 0xFFFF;

实际上,以下是将宏转换为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)

你不需要所有这个转换技巧只是为了获得一个数字的低16位。这里有更多的C定义来向您展示我在说什么:

{{1}}

您是否真的在生产代码中使用了该宏?

答案 1 :(得分:0)

在C#中获取整数的低16位非常容易:

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

如果你想要一个静态的方法,那就简单了:

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