9

私はすでにたくさんのスレッドを聞いたり、Google で見つけた他のスレッドを調べたりしました。私はまだこれを正しく理解できないようです。

//Room.h
#ifndef ROOM_H
#define ROOM_H

#include "Door.h"

typedef struct {
   Door* doors[3];

} Room;

#endif

//Door.h
#ifndef DOOR_H
#define DOOR_H

#include "Room.h"

typedef struct {
   Room* room1;
   Room* room2;
} Door;

//main.c
#include <stdio.h>
#include "Room.h"
int main() { ... }

これを Door.h の先頭に追加しようとしました

typedef struct Room room1;
//typedef struct Room* room1;
//typedef stuct Room;
//typedef struct Room*;

すべてが私にこのエラーを与えました:

「不明なタイプ名「ルーム」」

これらの構造体を個別のヘッダー ファイルに保持したいと考えています。

4

3 に答える 3

8

次のようにしてみてください。

typedef struct Room Room;
typedef struct Door Door;

struct Room{
   Door* doors[3];
};

struct Door{
   Room* room1;
   Room* room2;
};

最初の 2 行は、相互参照を可能にする型宣言です。

最初の 2 行が最初に来る限り、ヘッダー ファイルでこれらをどのように分離してもかまいません。


あなたの場合、それらは次のように分割できます。

room.h

typedef struct Door Door;

struct Room{
   Door* doors[3];
};

ドア.h

typedef struct Room Room;

struct Door{
   Room* room1;
   Room* room2;
};
于 2012-07-13T03:18:45.253 に答える
4

構造体参照の C ウェイ:

room.h

typedef struct Room_s {
  struct Door_s * doors[3];
} Room_t;

ドア.h

typedef struct Door_s {
  struct Room_s *room1;
  struct Room_s *room2;
} Door_t;
于 2012-07-13T04:26:10.543 に答える
1

匿名の構造体を作成して型定義する代わりに、以下のように構造体に特定の名前を付けます。

common.h

typedef struct Door_ Door;
typedef struct Room_ Room;

room.h

#include "common.h"

struct Room_ {
  Door* doors[3];
};

door.h

#include "common.h"

struct Door_ {
  Room *room1;
  Room *room2;
};

room.hただし、常に一緒に使用することを計画している場合は、door.hすべての定義を入れるために1つのファイルを作成するだけです。

于 2012-07-13T03:26:01.720 に答える