2

構造体へのポインタは頻繁に使用されるため、特別な演算子 -> があります。以下の式は同等です。

(*x).y
 x->y

この演算子を、次のように定義されたプリプロセッサ マクロと単純に考えてよいでしょうか。

#define (x)-> (*(x).)

なぜですか、そうでないのですか?それとも、最初からオペレーターとしてコーディングされていましたか?これはどのように異なる/有利でしょうか?

ちょっと興味があるんだけど。

4

3 に答える 3

4

以下の式は同等です:?

(*x).y
 x->y

はい、どちらも構造体メンバーにアクセスするための 2 つの異なる方法ですy

(*x).yoperator は.、値 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がそれを気に入ってくれることを願っています:)

于 2013-03-01T22:30:46.360 に答える
1

この演算子を、次のように定義されたプリプロセッサ マクロと単純に考えてよいでしょうか。

いいえ、そうではありません。

なぜですか、そうでないのですか?

マクロではないので。これは、言語で定義された別個の演算子であり、別の機能に構文糖衣を提供しているようです。

于 2013-03-01T22:01:19.443 に答える