デコードしようとしているプログラムには、次の行が含まれています。
#define nn(sp) ((sp)->nn)
コンテキスト (表示されていません) から、'sp' は、変数の 1 つとして 'nn' を含む構造体へのポインターであると確信しています。
「((sp)->nn)」という式で、内側の括弧のセットは考えられる目的に役立ちますか? そうでない場合、括弧の外側のセットも何の役にも立たないのでしょうか?
デコードしようとしているプログラムには、次の行が含まれています。
#define nn(sp) ((sp)->nn)
コンテキスト (表示されていません) から、'sp' は、変数の 1 つとして 'nn' を含む構造体へのポインターであると確信しています。
「((sp)->nn)」という式で、内側の括弧のセットは考えられる目的に役立ちますか? そうでない場合、括弧の外側のセットも何の役にも立たないのでしょうか?
#define nn(sp) ((sp)->nn)
内括弧は必須です。p + 10
またはのようなポインター*p
をマクロに渡す場合、 unaryよりも優先順位が高いnn
ため、内側の括弧がないと問題が発生します。->
+
*
式には後置操作が含まれており、後置演算子よりも優先される演算子はないため、ここでは外側の括弧は必要ありません。
マクロ引数と置換テキスト全体を括弧で囲むのは、一般的な防御戦略です。これにより、意図しない優先順位の変更からマクロが保護されます。
sp
引数が間接参照されたポインターであるかどうかを検討してください。
nn(*x) //--> ((*x)->nn)
ただし、内側の括弧なし:
nn(*x) //--> (*x->nn)