2

#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);

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

我将 bitshift 部分理解为重新排列字节,因为它们出现在字节数组中以匹配平台的字节顺序(或者也许有人可以纠正我)。但是,我对以下内容的使用感到困惑:

(++*(int **)(ppBytes)) ,

为什么那里有逗号?

4

1 回答 1

6

您所拥有的是一个由两个子表达式组成的表达式,由逗号运算符连接。第一个表达式将指针递增一个整数步长。无论指针的实际类型如何,它都被转换为int**first,然后取消引用到 an int*int*然后递增。结果,指向的地址将按sizeof(int)字节更改。

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

于 2012-07-02T09:57:19.570 回答