Endianness:这个宏在做什么?

时间:2012-07-02 09:40:21

标签: c endianness

我在第三方代码中遇到了以下#define

#define Endian_StreamGetLittleInt(ppBytes)  \
 (int) ((++*(int **)(ppBytes)), \
           (  ((*(char **)(ppBytes))[3-sizeof(int)] << 24) \
            | ((*(char **)(ppBytes))[2-sizeof(int)] << 16) \
            | ((*(char **)(ppBytes))[1-sizeof(int)] << 8)  \
            | ((*(char **)(ppBytes))[0-sizeof(int)])) )

它的用法如下:

int uiSize = Endian_StreamGetLittleInt(&buf);

其中bufchar *,指向先前从文件中读取的数据字节数。

我理解bitshift部分重新排列字节数组中出现的字节,以匹配平台的字节顺序(或者有人可以纠正我)。但是,我对使用:

感到困惑
(++*(int **)(ppBytes)) ,

为什么有逗号?

1 个答案:

答案 0 :(得分:6)

你所拥有的是一个由两个子表达式组成的表达式,由comma operator连接。第一个表达式将指针递增一个整数步长。无论指针的实际类型如何,首先将其强制转换为int**,然后取消引用int*,然后递增int*。因此,指向的地址将更改sizeof(int)个字节。

由于逗号运算符将始终首先执行其第一个参数,但返回其第二个参数的值,您首先看到增量,然后是值计算。但是如果你仔细观察,你会看到第二个参数确实使用了负数索引,所以它会在增加之前引用指针指向的数字。