次のコードは、gccの警告なしで正常にコンパイルされます。宣言されていない構造体によって警告が発生しない
構造体の前方宣言はありません。これは有効なCおよび/またはC++コードですか?
struct Foobar* f;
struct Foobar* fun() { return 0; }
int main() { f = 0; fun(); return 0; }
次のコードは、gccの警告なしで正常にコンパイルされます。宣言されていない構造体によって警告が発生しない
構造体の前方宣言はありません。これは有効なCおよび/またはC++コードですか?
struct Foobar* f;
struct Foobar* fun() { return 0; }
int main() { f = 0; fun(); return 0; }
これは不透明な構造と呼ばれ、エラーではありません。すべての構造体ポインタはCで同じ大きさなので、ポインタを操作するだけで構造体が持つフィールドを知る必要はありません。
変数Foobar(ポインタなし)を定義してみると、不完全な型エラーが発生します。
これにより、プライベートフィールドを持つタイプを持つことができます。 stdio.hのFILEタイプ
C.
struct Foobar* f;
で有効と同じである:Cで
struct Foobar;
struct Foobar* f;
は不完全型struct Foobar
を宣言し、それが不完全型へのポインタ・オブジェクトを宣言する。
タイプは別の翻訳単位で完了することができます。 (Cではオブジェクト、関数、不完全の3種類があります)。
あなたは不完全な型のオブジェクトを作成したり、型のサイズを取得することはできません。
struct Foobar x; // not valid
sizeof (struct Foobar); // not valid
をしかし、あなたは不完全型(struct Foobar* g;
)またはtypedef
(typedef struct Foobar Foobar;
)へのポインタを作成することができます。
はい、有効です。 – erip
構造体は宣言されていますが、定義されていません。これらの2つの用語は、しばしば互換的に使用されますが、異なることを意味します。 –
これは、構造体がメンバー(リンクリストなど)として独自の型へのポインタを含むことを可能にするものです。型が有効であるために型を完全に宣言する必要はありません。 – DevSolar