0

デコードしようとしているプログラムには、次の行が含まれています。

#define nn(sp)   ((sp)->nn)

コンテキスト (表示されていません) から、'sp' は、変数の 1 つとして 'nn' を含む構造体へのポインターであると確信しています。

「((sp)->nn)」という式で、内側の括弧のセットは考えられる目的に役立ちますか? そうでない場合、括弧の外側のセットも何の役にも立たないのでしょうか?

4

2 に答える 2

5
#define nn(sp)   ((sp)->nn)

内括弧は必須です。p + 10またはのようなポインター*pをマクロに渡す場合、 unaryよりも優先順位が高いnnため、内側の括弧がないと問題が発生します。->+*

式には後置操作が含まれており、後置演算子よりも優先される演算子はないため、ここでは外側の括弧は必要ありません。

于 2013-06-30T00:18:48.760 に答える
4

マクロ引数と置換テキスト全体を括弧で囲むのは、一般的な防御戦略です。これにより、意図しない優先順位の変更からマクロが保護されます。

sp引数が間接参照されたポインターであるかどうかを検討してください。

nn(*x)  //--> ((*x)->nn)

ただし、内側の括弧なし:

nn(*x)  //--> (*x->nn)
于 2013-06-30T00:18:58.253 に答える