当我编译下面的代码时,它正在运行而没有任何错误。
#include<stdio.h>
struct adjacency
{
struct node* dest;
struct adjacency* link;
};
struct node
{
char nodename;
struct node* next;
struct adjacency* adj;
};
int main( void )
{
//code
}
但是为什么呢?我认为它应该显示编译错误,因为它没有在struct adjacency中使用之前没有定义结构节点。但它运行得很好......可能的原因是什么?
答案 0 :(得分:2)
代码没有问题。 struct node
内adjacency
表示有一个名为node
的结构,struct node*
表示adjacency
指向struct node
。您不需要一个完整的类型(这是一个未定义类型的形式术语)来声明一个指针。如果adjacency
有成员struct node link;
,则会收到错误。
答案 1 :(得分:1)
C ++允许您将指针指向不完整的类型。 struct node *dest
就是这样的野兽。您有struct node
的前向引用,但由于您只是声明指向该类型的指针,因此编译器并不介意。这是明确允许的,它允许构建彼此引用的结构。
如果你需要两个在C ++中相互引用但不想在声明中使用struct
或class
关键字的类或结构,你可以做一个试验性声明:
struct node; // Incomplete type, but makes `node` known to compiler as a struct.
struct adjacency; // Incomplete type, but makes `adjacency` known to compiler as a struct.
struct adjacency
{
node *dest;
adjacency *link;
};
struct node
{
char nodename;
node *next;
adjacency *adj;
};
文体指南:将*放在变量名旁边,而不是类型。这就是编译器看到它的方式,当你编写类似struct node* next, prev;
之类的内容时,它会让你感到困惑,并想知道为什么prev
不是指针。写作的惯用方法是struct node *next, *prev;
。