繁体   English   中英

为什么没有编译错误?

[英]Why is there no compilation error?

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

#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内部的struct node表示存在一个名为node的结构,而struct node*表示adjacency持有指向struct node的指针。 您不需要完整的类型(这是未定义定义的类型的正式术语)来声明指针。 如果adjacency具有成员struct node link; 你会得到一个错误。

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;类的东西时,它将避免您造成混乱struct node* next, prev; ,并想知道为什么prev不是指针。 struct node *next, *prev;的惯用写法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM