今日、FUSE オープンソース コードの作業を開始しました。次のような行がいくつか見つかりました。
struct fuse_session;
struct fuse_chan;
私が知っている限り、それを解釈する方法がわかりませんstruct
。この場合、名前付きエンティティの後に が 1 つしかないstruct
ため、このヒューズ セッションは構造変数または構造名そのものです。これは本当に基本的なことかもしれませんが、どこにも見つけることができません。
今日、FUSE オープンソース コードの作業を開始しました。次のような行がいくつか見つかりました。
struct fuse_session;
struct fuse_chan;
私が知っている限り、それを解釈する方法がわかりませんstruct
。この場合、名前付きエンティティの後に が 1 つしかないstruct
ため、このヒューズ セッションは構造変数または構造名そのものです。これは本当に基本的なことかもしれませんが、どこにも見つけることができません。
これは通常、次のいずれかに使用されます。
あるモジュールのユーザーにこの構造体が存在することを知らせたいが、その内容を公開したくない。例えば:
api.hで:
struct bar;
void GetStruct(struct bar *);
void SetActive(struct bar *, char);
内部ファイル内:
struct bar {
char is_active;
};
void GetStruct(struct bar * st) {
st = malloc(sizeof(struct bar));
}
void SetActive(struct bar * st, char active) {
if (st != NULL)
st->is_active = active;
}
このようにして、実装をカプセル化し、使用するモジュールに影響を与えることなく、必要に応じて後で構造体を変更できます。
宣言する前に構造体(ポインター)を使用したい。例えば:
struct bar;
typedef int (*FooFuncType)(struct bar *);
struct bar {
FooFuncType a_func;
};
1つの重要な注意:
質問のように構造体宣言しかない場合は、構造体を直接参照することも、sizeof
演算子を使用することもできず、構造体へのポインターを宣言するだけです。
これらは不完全な型または不透明な型であり、ライブラリ インターフェイスがそれらの型へのポインターでのみ機能する場合に役立ちます。構造内にあるもののすべての詳細を入力する必要はないため、ライブラリの外部のコードは構造内のデータに (合法的に) アクセスできません。ライブラリ内のコードには、構造内にあるものの詳細を提供するプライベート ヘッダーがあるため、ライブラリは実際に内容を操作できますが、これはライブラリの利用者には隠されている詳細です。
不完全な型は、時々使用される別の代替手段、つまり void ポインターよりもはるかに優れた型安全性を提供します。複数の異なるタイプがすべて「void *
」で表されると、混乱しやすくなります。不完全な型の場合、さまざまな型を適切に区別できますが、実装方法の詳細を明らかにすることはできません。
forward declaration
での紹介を取得する必要がありますC
。このリンクをお試しください。
いくつかのライブラリの API 提供のヘッダー ファイルでそのようなものを見つけました。一部のライブラリは、ライブラリで使用される一部の構造のメンバーの詳細を公開したくないが、アプリケーションがそれらの構造をポインターとして使用できるようにすることを意図している.
Forward Declaration
これは、コンパイラがプログラムのさまざまな部分からの構造参照を解決するのに役立ちます。