web-dev-qa-db-ja.com

構造体内の構造

個人を作成する必要があり、各個人には冷蔵庫が必要です。これが最善の方法ですか?もしそうなら、私は何が間違っていますか?前もって感謝します。

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;

これにより、次のエラーが表示されます。

エラー:フィールド「冷蔵庫」のタイプが不完全です

11
sok

struct FRIDGEFRIDGEとは異なるものです。

他の構造でタイプFRIDGEを使用する必要があります。

typedef struct {
 int age;
 FRIDGE fridge;
} PERSON;

または、冷蔵庫をstruct FRIDGE

struct FRIDGE {
 int number;
};

また、構造は、使用する前に定義する必要がある場合があります(人の上など)。

19
che

すべての警告とエラーを削除した後、FRIDGEのメンバーを使用する必要があります。 FRIDGEの前にPERSONを宣言します

me.fridge.number = 1

[〜#〜] edited [〜#〜]:バグを見つけました。匿名構造を使用しているため、structキーワードを使用するのではなく、typedefed名を使用する必要があります。

変化する struct FRIDGE fridgeからFRIDGE fridge

3
manav m-n

struct FRIDGE;の前方宣言を行う

または、

struct FRIDGEで使用する前にPERSONの定義を与える

1
Omkant

構造体で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を使用するのが混乱し、悪いのかという非常に堅実な理由です。

https://yarchive.net/comp/linux/typedefs.html

0
Cobusve