私が次のようなものを書くと
#define INT_PTR int*
INT_PTR ptr4, ptr5, ptr6;
この場合、ptr4のみが整数へのポインターであり、残りの値(ptr5およびptr6)は整数です。彼らはどのように整数値を取っていますか?コンパイルエラーが発生するはずです。
コンパイラがptr5とptr6を整数として扱っているのはなぜこのようになっているのですか。
私が次のようなものを書くと
#define INT_PTR int*
INT_PTR ptr4, ptr5, ptr6;
この場合、ptr4のみが整数へのポインターであり、残りの値(ptr5およびptr6)は整数です。彼らはどのように整数値を取っていますか?コンパイルエラーが発生するはずです。
コンパイラがptr5とptr6を整数として扱っているのはなぜこのようになっているのですか。
ポインタオブジェクトを宣言するには、次のようにします。
int *ptr4, *ptr5, *ptr6;
Cでは、トークン*
は型情報に属していないため、複数のオブジェクトを宣言するときにトークンを繰り返す必要があります。これはCでよくある間違いであることに注意してください。
typedef
代わりにできることは次のとおりです。
typedef int * INTPTR;
#define
これは実際には、単にテキストの置換であるとは何の関係もありません。
プリプロセッサフェーズの後(置換が行われるとき)、最終的に次のようになります。
int* ptr4, ptr5, ptr6;
また、バインドは型ではなく変数*
にバインドされるため、 1つの整数ポインターと2つの整数を作成します。
これが私が書くことを好む理由です:
int *xyzzy;
それよりも:
int* xyzzy;
前者は、が変数*
に属していることを明確にするためです。Cで新しい型を定義したい場合、コマンドは驚くべきことに、:-)です。typedef
typedef int * INTPTR;
INTPTR ptr4, ptr5, ptr6;
これは、マクロのようにテキストを置き換えるだけでなく、それに続くすべての変数に適用される新しいタイプを定義します。つまり、タイプINTPTR
( )は、、およびint *
の3つすべてに適用されます。ptr4
ptr5
ptr6
コードは次のように展開されます
int* ptr4, ptr5, ptr6;
また、アスタリスク(*)宣言は、それに続く識別子にのみ適用されるため、実際にはptr4のみがポインターになるのは当然です。(ちなみに、それが概念的に書くのが間違っている理由です
int* ptr;
ポインタ宣言は1つの変数のみを対象としていることを示す必要があるため、次のようになります。
int *ptr.
)。
したがって、#define
プリプロセッサディレクティブ(タイプ定義でも間違っています)の代わりに、Ctypedef
キーワードを使用します。
typedef int *inptr;
intptr ptr4, ptr5, ptr6;