C の Forward Declarations についてお聞きしたいと思います。たとえば、ファイルで宣言する場合
struct task_struct;
他のファイルで構造体を定義すると機能しますか?私の知る限り、コンパイラは宣言されている変数のサイズを知っている必要があるためです。もしそうなら、コンパイラは実際にそのようなタイプのリクエストをどのように処理しますか?
Linux ソース コードで上記の例を見つけて興味を持ちました。
C の Forward Declarations についてお聞きしたいと思います。たとえば、ファイルで宣言する場合
struct task_struct;
他のファイルで構造体を定義すると機能しますか?私の知る限り、コンパイラは宣言されている変数のサイズを知っている必要があるためです。もしそうなら、コンパイラは実際にそのようなタイプのリクエストをどのように処理しますか?
Linux ソース コードで上記の例を見つけて興味を持ちました。
前方宣言を使用すると、型はコンパイラの不完全型になります。
コンパイラは型のサイズやレイアウトについて何も知らないため、コンパイラがこれらを知る必要がある操作を実行することはできません。
C では、型を前方宣言する場合、その型へのポインターしか使用できません。すべての構造体型へのポインタは同じサイズ[注]である必要があるため、コンパイラは、型へのポインタがあることを知って喜んでいます。
構造体を前方宣言し、それを他のファイルで定義すると機能しますか?
構造を前方宣言するファイル内の構造へのポインターのみを使用する限り、それは可能です。ポインターを逆参照すると、エラーが発生します。コンパイラーは Incomplete 型のレイアウトを認識していないためです。
[注]この説明についてメルポメンとダニエルに感謝します。
「仕事」とはどういう意味ですか?いずれにせよ、それは独自の方法で機能します。
構造体型の完全な宣言が表示されていない時点では、それは不完全な型であり、不完全な型としてのみ使用できます。
構造体型の完全な宣言が表示された時点で、それは完全な型になり、完全な型として使用できます。
これですべてです。
不完全な構造体タイプの使いやすさは、完全なものに比べて大幅に低下します。基本的に、そのような型へのポインタを宣言して渡すことしかできません。それ以外のもの(そのタイプのオブジェクトの宣言など)には、完全な宣言が必要です。