为何struct node未完全定义时可在内部声明node*类型指针
为什么未完成定义的
struct node内部可以声明node*类型指针 这个特性是C/C++类型系统对不完整类型的通用处理规则,不是链表场景的特殊语法:
- 当你输入
struct node {开始定义结构体时,编译器从这一行开始就已经将struct node识别为合法类型名,只是在遇到闭合的大括号}之前,这个类型的成员组成、总内存大小都还没确定,属于不完整类型。 - 类型系统对不完整类型的唯一限制是:不允许执行任何需要提前知道该类型内存大小、内存布局的操作。
- 声明指向不完整类型的指针完全不违反这个限制:无论指针指向的类型是什么,固定平台下指针本身的内存大小是恒定的——64位系统下所有指针占8字节,32位系统下占4字节。编译器不需要知道
struct node的完整定义,就能算出next指针成员的内存偏移、占用空间,不会阻碍整个结构体的内存布局计算,因此语法完全合法。
你可以做个反向验证:如果把成员写成
node next;(非指针的普通实例成员),编译器会直接抛出错误。因为这种写法是把一个完整的node实例直接嵌套在结构体内部,编译器必须拿到node的总大小才能计算整个结构体的内存布局,但此时node还没完成定义属于不完整类型,无法获取准确大小,自然会被语法拦截。
补充一个小细节:你贴的示例代码在C环境中可以直接编译通过,因为C的规则是结构体定义完成后,结构体标签会直接作为类型名使用;但在标准C环境中,这个写法会报node未定义的错误,需要改成struct node* next;,或者提前用typedef给struct node起别名为node,这个是C和C++的标识符作用域规则差异,和前面说的不完整类型指针规则无关。
两种环境下的合法参考代码:
// 标准C合法写法1:显式携带struct关键字 struct node { int data; struct node* next; }; // 标准C合法写法2:提前typedef别名 typedef struct node node; struct node { int data; node* next; };
// C++合法写法 struct node { int data; node* next; };
内容的提问来源于stack exchange,提问作者Siddharth Mishra
相关产品推荐
相关产品推荐

