個人を作成する必要があり、各個人には冷蔵庫が必要です。これが最善の方法ですか?もしそうなら、私は何が間違っていますか?前もって感謝します。
typedef struct {
int age;
struct FRIDGE fridge;
} PERSON;
typedef struct {
int number;
} FRIDGE;
FRIDGE fr;
fr.number=1;
PERSON me;
me.name=1;
me.fridge = fr;
これにより、次のエラーが表示されます。
エラー:フィールド「冷蔵庫」のタイプが不完全です
struct FRIDGE
はFRIDGE
とは異なるものです。
他の構造でタイプFRIDGE
を使用する必要があります。
typedef struct {
int age;
FRIDGE fridge;
} PERSON;
または、冷蔵庫をstruct FRIDGE
struct FRIDGE {
int number;
};
また、構造は、使用する前に定義する必要がある場合があります(人の上など)。
すべての警告とエラーを削除した後、FRIDGE
のメンバーを使用する必要があります。 FRIDGE
の前にPERSON
を宣言します
me.fridge.number = 1
[〜#〜] edited [〜#〜]:バグを見つけました。匿名構造を使用しているため、struct
キーワードを使用するのではなく、typedef
ed名を使用する必要があります。
変化する struct FRIDGE fridge
からFRIDGE fridge
struct FRIDGE;
の前方宣言を行う
または、
struct FRIDGE
で使用する前にPERSON
の定義を与える
構造体でtypedefを使用すると、このような混乱に陥ります。 structタグ識別子の前にあるstructキーワードは、structがどのように使用されることになっているのか、これはより明示的で読みやすいです。
ここにすべての詳細を含む長くて良いブログ投稿があります https://www.microforum.cc/blogs/entry/21-how-to-struct-lessons-on-structures-in-c/
しかし、要するに、あなたが本当にやりたいことは、このようなtypedefを省くことです
struct FRIDGE; // This is a forward declaration, now an incomplete type
struct PERSON{
int age;
struct FRIDGE fridge;
};
struct FRIDGE{
int number;
};
struct FRIDGE fr;
fr.number=1;
struct PERSON me;
me.name=1;
me.fridge = fr;
Linus Torvaldsはこれについても1回続けました。なぜすべての構造体でtypedefを使用するのが混乱し、悪いのかという非常に堅実な理由です。