我正在尝试定义一个包含三个成员结构的Sprite结构(在其他头文件中定义)。由于某种原因,编译器为外部结构提供错误:
C2061错误:标识符'GraphicsComponent'
C2061错误:标识符'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
答案 0 :(得分:1)
您的代码不包含其他标头,其中包含GraphicsComponent
和PhysicsComponent
的定义。你应该添加像
#include "otherHeader.h"
在上面的结构定义之前。
标题之间存在循环依赖关系:AFGraphics.h和AFPhysics.h #include
AFObjectFactory.h。您必须消除此循环依赖关系才能编译代码。
最直接的方法是使用其他结构的前向声明替换AFObjectFactory.h中的#includes:
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。
E.g。现在AFPhysics.h包含PhysicsComponent
的定义,以及一些带有Sprite
参数的方法。这使得编译器无法在没有前向声明的情况下解析头文件,因为AFObjectFactory.h和AFPhysics.h相互依赖。
如果将带有Sprite
参数的方法声明移动到AFObjectFactory.h中,则AFPhysics.h对AFObjectFactory.h的依赖关系不再存在,因此您可以从AFPhysics.h中删除#include "AFObjectFactory.h"
行。而在AFObjectFactory.h中代替#include AFPhysics.h
,无需在那里转发声明struct PhysicsComponent_t
。 (当然,其他安排也是可能的 - 这只是我脑海中最简单的安排。重点是将标题中的定义分组,以便始终有一个定义良好的包含顺序,没有循环依赖。)