Определение структуры с членскими структурами - PullRequest
1 голос
/ 23 мая 2011

Я пытаюсь определить структуру Sprite, которая содержит три структуры-члена (определенные в других заголовках).По какой-то причине компилятор выдает ошибки для внешних структур:

C2061 error: идентификатор 'GraphicsComponent'

C2061 error: идентификатор 'PhysicsComponent'

AFObjectFactory.h http://pastebin.com/raw.php?i=ps9DvgQG

AFObjectFactory.c http://pastebin.com/raw.php?i=HTEmSkdu

AFGraphics.h http://pastebin.com/raw.php?i=GpsXfy1n

AFGraphics.c http://pastebin.com/raw.php?i=cm3s6Nqg

AFPhysics.h http://pastebin.com/raw.php?i=DmQKBxpW

AFPhysics.c http://pastebin.com/raw.php?i=tsVQVUCC

#ifndef AFOBJECTFACTORY_H
#define AFOBJECTFACTORY_H

struct GameObjectComponent_t
{   
  struct GameObjectComponent_t* next;
};
typedef struct GameObjectComponent_t GameObjectComponent;

struct Sprite_t
{   
  GameObjectComponent GameObjectProperties;
  GraphicsComponent   GraphicsProperties;
  PhysicsComponent    PhysicsProperties;
};
typedef struct Sprite_t Sprite;

Sprite* CreateSprite(int color, 
                     int screenX, int screenY, int worldX, int worldY, 
                     int h, int w);

#endif

1 Ответ

1 голос
/ 23 мая 2011

Ваш код не включает другие заголовки, которые предположительно содержат определения GraphicsComponent и PhysicsComponent. Вы должны добавить что-то вроде

#include "otherHeader.h"

перед приведенными выше определениями структуры.

Обновление

Существует циклическая зависимость между вашими заголовками: AFGraphics.h и AFPhysics.h #include AFObjectFactory.h. Вы должны устранить эту циклическую зависимость, чтобы код компилировался.

Самый простой способ - заменить #include в AFObjectFactory.h на предварительные объявления других ваших структур:

struct GraphicsComponent_t;
struct PhysicsComponent_t;

struct GameObjectComponent_t
{   
  struct GameObjectComponent_t* next;
};
typedef struct GameObjectComponent_t GameObjectComponent;

struct Sprite_t
{   
  GameObjectComponent GameObjectProperties;
  struct GraphicsComponent_t GraphicsProperties;
  struct PhysicsComponent_t PhysicsProperties;
};

Но лучшим долгосрочным подходом было бы перемещать вещи между заголовками, чтобы отсортировать правильный порядок, в котором они должны быть определены, и заголовками #include d.

например. прямо сейчас AFPhysics.h содержит определение PhysicsComponent и некоторые методы с параметрами Sprite. Это делает невозможным синтаксический анализ заголовков компилятором без предварительного объявления, поскольку AFObjectFactory.h и AFPhysics.h взаимно зависят друг от друга.

Если вы переместили объявления методов с параметрами Sprite в AFObjectFactory.h, зависимость AFPhysics.h от AFObjectFactory.h перестала существовать, поэтому вы можете удалить строку #include "AFObjectFactory.h" из AFPhysics.h и вместо нее #include AFPhysics.h в AFObjectFactory.h, устраняя необходимость пересылки объявить struct PhysicsComponent_t там. (Конечно, возможны и другие механизмы - это самое простое, что приходит мне в голову. Смысл в том, чтобы сгруппировать ваши определения в заголовках, чтобы всегда был четко определенный порядок включения, без циклических зависимостей.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...