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

ここで、bufは、char *以前にファイルから読み取られたデータのバイト数を指します。

ビットシフトセクションは、プラットフォームのエンディアンに一致するようにバイト配列に表示されるバイトを再配置するものとして理解しています(または誰かが私を修正できる可能性があります)。しかし、私は次の使用に戸惑っています。

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

なぜそこにコンマがあるのですか?

4

1 に答える 1

6

あなたが持っているのは、コンマ operatorで結合された 2 つのサブ式で構成される式です。最初の式は、ポインターを 1 つの整数ステップだけインクリメントします。ポインターの実際の型に関係なく、最初にキャストされ、次に anにint**逆参照され、その後インクリメントされます。その結果、ポイントされるアドレスはバイト単位で変化します。int*int*sizeof(int)

コンマ演算子は常に最初の引数を最初に実行しますが、2 番目の引数の値を返すため、最初にインクリメントが表示され、次に値の計算が表示されます。しかし、よく見ると、2 番目の引数が負のインデックスを使用していることがわかります。そのため、インクリメントされる前にポインターが指していた数値を参照します。

于 2012-07-02T09:57:19.570 に答える