3

私はヘッダーとこのヘッダーを使用するサンプル アプリケーションをすべて C で作成しています。これを除いて、このソフトウェアのほぼすべてのロジックを取得します。これはヘッダーの興味深い部分です。

struct A;
typedef struct A A;

C アプリケーションでは、これAはこのようなポインターを宣言する場合にのみ使用されます。

A* aName;

これは、スコープ/名前空間に含めて、基本的に無効なポインターに名前を付けるだけのソリューションであると確信していAます。この種のポインターは、ある種のデータを処理するためにのみ使用されるため、名前空間に似ていますシュガー。

これは何のためでしょうか?

4

3 に答える 3

4

それvoidは不完全な型であり、このファイルAでも不完全な型です。不完全な型でできることは、それらへのポインターを渡すことだけです。

void*このファイルには 1の利点があります。これは、B. したがって、型の安全性が少し得られます。AiswindowHandleBisの場合jpgHandle、間違ったものを関数に渡すことはできません。

を受け入れる関数を定義するファイルvoid*よりも利点があります-- そのファイルには の定義を含めることができ、最初のファイルが知る必要のない必要なメンバーを与えることができます。.cA*struct AA

Aただし、ヘッダーファイルには他に言及がないと言います。つまり、それを受け入れたり返したりする関数はありません。また、ソースファイルでの唯一の使用はポインターを宣言することだとも言いAます-それらのポインターの値がどこから来たのだろうか.

誰かが初期化されていないものを定義し、A*それを使用しない場合にすべてが発生する場合、明らかにこれは古いコードの残骸であるか、書かれたことのないコードの始まりであり、ファイルにまったく含まれるべきではありません。

最後に、実際の型が よりも少しばかげAていない名前である場合、その名前がその使用の手がかりになる可能性があります。

于 2012-09-19T17:55:10.997 に答える
2

struct Aは前方宣言だと思います。ファイルの 1 つで定義されている可能性が最も高いです.c

そうstruct Aすることで、 のメンバーは、それを定義するモジュールに対してプライベートになります。

于 2012-09-19T16:53:07.263 に答える
1

これは、ハンドルを渡すのに役立つ不透明なポインターの例です。詳細については、 http://en.wikipedia.org/wiki/Opaque_pointerを参照してください。ここで C++ の観点から興味深いのは、(まだ) undefined へのポインターであるメンバーを使用してクラスを定義できるという概念ですstruct。したがって、これstructはヘッダーでまだ定義されていませんが、後の一部の cpp 実装では、これstructに本体が指定され、コンパイラーが残りを行います。この戦略は、Pimpl イディオムとも呼ばれます (インターネット上には他にもたくさんあります)。Microsoft は、http://msdn.microsoft.com/en-us/library/hh438477.aspxで簡単に説明しています。

于 2013-08-08T09:32:18.943 に答える