我有这样的代码,我不能把“struct node”放在“struct mnode”之上 所以我宣布它在顶部,如下所示 但是编译器说字段n的类型不完整 如何正确地在顶部声明一个结构?
struct node;
struct mnode{
int j;
node n;
};
struct node{
int k;
};
答案 0 :(得分:5)
对于类类型的类成员,您需要一个定义。声明不会。因此,在这种情况下,node
的完整定义必须在mnode
之前。
前向声明仅在不需要完整定义时才起作用 - 指针或引用成员,返回类型或方法参数。
答案 1 :(得分:1)
那是因为node
......不完整。结构/类定义中不能包含不完整类型的字段。但是你可以有一个指向节点的指针,因为指针的大小是已知的:
struct node;
struct mnode{
int j;
node* n;
};
struct node{
int k;
};
答案 2 :(得分:1)
编译器抱怨,因为它需要了解mnode
的一些内容,因为它需要有关node
的更多信息。首先,它需要知道mnode
对象的大小才能构建它,但为此需要知道node
的大小。它还需要知道如何生成以下函数:
为此,它需要node
中的相应功能。我可能忘记了别的东西,但是你可以看到它需要node
的完整定义来做很多事情。所以不,提前声明不会。
如果由于某种原因无法提供node
的完整定义,您可以将n
的类型更改为node*
。编译器拥有指针的所有信息,因此没有问题。