编译器循环引用

时间:2012-10-20 18:29:50

标签: c++ c compiler-construction struct

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

typedef struct Project Project;

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

struct Project{
 Worker member[30];
}

编译过程抛出以下错误:

  

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

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

3 个答案:

答案 0 :(得分:2)

正如评论中提到的,结构类型都应该将指针保存到另一种类型。按照目前的情况,ProjectWorker结构都必须无限大,因为每个Worker将包含10个Project s,其中包含30个Worker等等。

答案 1 :(得分:2)

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

这样的事情:

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

struct Project{
  Worker member[30];
}

答案 2 :(得分: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];
};