0

我在我的代码中定义了两种类型。

typedef struct Project Project;

typedef struct Worker{
  Project projects[10];
}Worker;

struct Project{
 Worker member[30];
}

编译过程抛出以下错误:

数组类型具有不完整的元素类型

我认为是由于循环引用,当编译器尝试为数组分配空间时,它不知道类型 Project,如果我更改类型的定义顺序,也会发生同样的事情。我对这个问题是否正确?最重要的是,我该如何解决这个问题?

4

3 回答 3

2

正如评论中提到的,两种结构类型都应该保存指向另一种类型的指针。就目前而言,ProjectWorker结构都必须无限大,因为每个Worker都包含 10 个Projects,其中包含 30 个Workers,等等。

于 2012-10-20T18:40:04.663 回答
2

你是对的。您的 Worker 结构按值包含 Project 类型的成员。为了让编译器正确地构造 Worker 对象,它需要知道它的大小。这意味着它需要具有 Project 类型的完整定义 - 在您的代码中,它仅在几行之后定义。您可以通过在 Worker 结构中使用对项目成员的引用/指针并使用前向声明来宣布它来解决此问题,以便编译器知道它是已知类型(由于指针的大小与类型无关,因此避免了上述问题它指向因此编译器不需要完整的类型定义)。

像这样的东西:

struct Project;  //forward declaration of Project type
typedef struct Worker{
  Project *projects[10];
} Worker;

struct Project{
  Worker member[30];
}
于 2012-10-20T18:46:32.963 回答
1

当你声明一个类型的数组时Project,编译器需要知道定义以便定义Worker. 使用您的前向声明Project,您只是通知编译器存在Project,但它需要知道完整的定义。您可以改为声明一个指针并执行malloc.

typedef struct Project Project;

typedef struct Worker{
  Project *projects;
}Worker;

struct Project{
 Worker *member;
};

旁注:结构定义中缺少分号:

struct Project{
 Worker member[30];
};
于 2012-10-20T18:42:07.117 回答