構造体へのポインタは頻繁に使用されるため、特別な演算子 -> があります。以下の式は同等です。
(*x).y
x->y
この演算子を、次のように定義されたプリプロセッサ マクロと単純に考えてよいでしょうか。
#define (x)-> (*(x).)
なぜですか、そうでないのですか?それとも、最初からオペレーターとしてコーディングされていましたか?これはどのように異なる/有利でしょうか?
ちょっと興味があるんだけど。
以下の式は同等です:?
(*x).y
x->y
はい、どちらも構造体メンバーにアクセスするための 2 つの異なる方法ですy
。
(*x).y
operator は.
、値 variable で機能する DOT ですElement selection by reference
。その理由が*
使用されます。手段x
は構造体へのポインタです。
x->y
->
と呼ばれる演算子が使用されElement selection through pointer
ます。これは、構造体へのポインターで機能します。*
それが今回使わなかった理由です。
どちらも同じように動作します。
この演算子を、次のように定義されたプリプロセッサ マクロと単純に考えてよいでしょうか。
#define (x)-> (*(x).)
いいえ 、最初にエラーが発生します: マクロ名は識別子でなければなりません。->
このエラーは、演算子をマクロ名として使用できないためです。
有効なマクロ名は次のとおりです。
マクロ名は、英数字とアンダースコア ('az'、'AZ'、'0-9'、'_' など) のみで構成する必要があり、最初の文字は数字であってはなりません。一部のプリプロセッサではドル記号 '$' も使用できますが、使用しないでください。残念ながら、C 標準のコピーを持っていないため、C 標準を引用することはできません。
->
また、上で述べたように、 と.
は違いの演算子であることに注意してください。また、優先順位も異なるため、ある演算子を別の演算子に置き換えるのはお勧めできません。
構造体要素にアクセスするための有効なマクロ:
さらに、今日はほとんどの C ヘッダー ファイルを知っていることだけを共有したいと思います。次のような定義済みマクロ:
#define S(x) ((x).y)
特定の strcut 要素に対して。
(x)
かっこを囲むと、 overx
の優先順位が上書きされることに注意してください。デフォルトでは、DOT は ポインタと単純な変数に使用できるように、よりも優先されます。以下の私の例は参考になると思います。*
.
.
*
#define S(x) ((x).y)
typedef struct {
int y;
}X;
X *x;
X b;
int main(){
S(*x);
S(b);
}
編集:
より良いオプション
strcut 要素にアクセスするようにアイデアを拡張しています。新しいマクロを定義しました。
#define S(x,y) ((x).y)
typedef struct {
int a;
}X;
X *x;
X b;
int main(){
S(*x,a);
S(b,a);
}
マクロを介した特定の要素ではありません。
少なくともOPがそれを気に入ってくれることを願っています:)
この演算子を、次のように定義されたプリプロセッサ マクロと単純に考えてよいでしょうか。
いいえ、そうではありません。
なぜですか、そうでないのですか?
マクロではないので。これは、言語で定義された別個の演算子であり、別の機能に構文糖衣を提供しているようです。