繁体   English   中英

编译器循环参考

[英]Compiler circular reference

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

typedef struct Project Project;

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

struct Project{
 Worker member[30];
}

编译过程将引发以下错误:

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

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

如注释中所述,两种结构类型都应持有指向另一种类型的指针 就目前而言, ProjectWorker结构都必须无限大,因为每个Worker将包含10个Project ,其中将包含30个WorkerWorker

没错 您的Worker结构包含按值类型Project的成员。 为了使编译器正确构造Worker对象,它需要知道它的大小。 这意味着它需要具有Project类型的完整定义-并且在您的代码中仅在几行后定义。 您可以通过以下方式来解决此问题:使用对Worker结构中Project成员的引用/指针,并使用前向声明进行声明,以便编译器将其称为已知类型(避免了上述问题,因为指针的大小与类型无关)它指向因此编译器不需要完整的类型定义)。

像这样:

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

struct Project{
  Worker member[30];
}

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

typedef struct Project Project;

typedef struct Worker{
  Project *projects;
}Worker;

struct Project{
 Worker *member;
};

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

struct Project{
 Worker member[30];
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM