私が次のようなものを書くと
#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つすべてに適用されます。ptr4ptr5ptr6
コードは次のように展開されます
int* ptr4, ptr5, ptr6;
また、アスタリスク(*)宣言は、それに続く識別子にのみ適用されるため、実際にはptr4のみがポインターになるのは当然です。(ちなみに、それが概念的に書くのが間違っている理由です
int* ptr;
ポインタ宣言は1つの変数のみを対象としていることを示す必要があるため、次のようになります。
int *ptr.
)。
したがって、#defineプリプロセッサディレクティブ(タイプ定義でも間違っています)の代わりに、Ctypedefキーワードを使用します。
typedef int *inptr;
intptr ptr4, ptr5, ptr6;