C语言中为何可在typedef定义前使用struct node指针类型?
C语言结构体typedef里的指针声明为啥有差异?
最小可复现代码
#include <stdlib.h> typedef struct node_type { struct node* next; struct node* prev; } node; int main(int argc, char* argv[]) { node* n = (node*)malloc(sizeof(node)); }
问题拆解
为啥结构体里直接写node*会报错(提示node未定义),但写struct node*就能正常编译?明明此时只有struct node_type被定义啊?另外用struct node_type*或者先单独定义typedef再用node*也能正常编译,这中间的规则到底是啥?
直白解释
1. struct node*能编译的原因
C语言有个默认规则:当你写出struct 某个名称的时候,哪怕这个结构体还没完整定义,编译器会自动把它当成**“不完整类型”**先记录下来,用它声明指针完全没问题——因为指针的大小是固定的,不需要知道结构体内部的具体内容。哪怕你到最后都没给struct node补全完整定义,只要不去解引用这个指针(比如n->next->xxx这种访问成员的操作),代码就能正常编译。你代码里的struct node就是这种情况,所以编译器允许这么写。
2. node*报错的原因
typedef struct node_type { ... } node;这种写法里,node这个typedef别名要等整个typedef语句执行完才会生效。也就是说,在结构体的{}内部写代码的时候,node还没被定义出来,编译器根本不知道它代表什么,自然会报错。
3. 其他合法写法的逻辑
- 用
struct node_type*:因为在typedef开头已经声明了struct node_type,虽然结构体还没写完,但它已经属于“不完整类型”,用来声明指针完全合法。 - 先定义typedef再写结构体:比如改成下面这样:
typedef struct node_type node; struct node_type { node* next; node* prev; };
这时候node这个别名在结构体定义之前就已经被声明了,所以结构体内部用node*的时候,编译器能认出它就是struct node_type*,自然没问题。
内容的提问来源于stack exchange,提问作者ArcWand
相关产品推荐
相关产品推荐

