为什么没有编译错误?

时间:2013-11-10 18:34:00

标签: c++ c compiler-errors

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

#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中使用之前没有定义结构节点。但它运行得很好......可能的原因是什么?

2 个答案:

答案 0 :(得分:2)

代码没有问题。 struct nodeadjacency表示有一个名为node的结构,struct node*表示adjacency指向struct node。您不需要一个完整的类型(这是一个未定义类型的形式术语)来声明一个指针。如果adjacency有成员struct node link;,则会收到错误。

答案 1 :(得分:1)

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

如果你需要两个在C ++中相互引用但不想在声明中使用structclass关键字的类或结构,你可以做一个试验性声明:

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;