[英]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 ++中相互引用的类或结构,但又不想在声明中使用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;
类的东西时,它将避免您造成混乱struct node* next, prev;
,并想知道为什么prev
不是指针。 struct node *next, *prev;
的惯用写法 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.