2

当我编译下面的代码时,它运行没有任何错误。

#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
}

但是为什么?我认为它应该显示编译错误,因为它在结构邻接中使用之前没有定义结构节点。但它运行得很好。可能的原因是什么?

4

2 回答 2

2

代码没有问题。struct node里面adjacency说有一个名为 的结构node,并struct node*说它adjacency持有一个指向struct node. 您不需要完整的类型(这是尚未看到其定义的类型的正式术语)来声明指针。如果adjacency有成员struct node link;,您会收到错误消息。

于 2013-11-10T18:36:15.723 回答
1

C++ 允许您拥有指向不完整类型的指针。 struct node *dest就是这样的野兽。您有对 的前向引用struct node,但由于您只是声明了一个指向该类型的指针,编译器并不介意。这是明确允许的,它允许构建相互引用的结构。

如果您需要两个在 C++ 中相互引用的类或结构,但不想在声明中使用structorclass关键字,则可以进行试探性声明:

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;.

于 2013-11-10T18:37:06.667 回答