编译器循环引用

问题描述 投票:0回答:3

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

typedef struct Project Project;

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

struct Project{
 Worker member[30];
}

编译过程抛出以下错误:

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

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

c++ c struct
3个回答
2
投票

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

类似这样的:

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

struct Project{
  Worker member[30];
}

2
投票

正如评论中提到的,两种结构类型都应该保存指向另一种类型的指针。按照目前的情况,

Project
Worker
结构都必须无限大,因为每个
Worker
将包含十个
Project
,这将包含30个
Worker
,依此类推。


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];
};
© www.soinside.com 2019 - 2024. All rights reserved.