您现在的位置是:百科 >>正文
typedef struct在c语言中是什么意思
百科5647人已围观
简介写C代码的时候,你几乎躲不开typedef struct。它不是什么高深语法,但第一次见到的人容易卡住——明明struct已经能定义结构体了,为什么前面还要加个typedef? 直接说结论:typed ...
写C代码的语言意思时候,你几乎躲不开typedef struct。语言意思它不是语言意思什么高深语法,但第一次见到的语言意思人容易卡住——明明struct已经能定义结构体了,为什么前面还要加个typedef?语言意思
直接说结论:typedef struct就是把“结构体类型”重新起个短名字,省得你每次声明变量都写一长串。语言意思比如定义一个点:
struct Point { int x; int y; }; 之后声明变量得写struct Point p1;。语言意思那个struct关键字每次都要带,语言意思烦。语言意思用typedef改一下:
typedef struct Point { int x; int y; } Point; 现在直接写Point p1;就行。语言意思struct那层壳被typedef吃掉了。语言意思
这里有个细节值得说。语言意思上面那种写法,语言意思struct Point和Point是语言意思两个名字,指向同一个类型。语言意思你也可以把结构体标签省掉:
typedef struct { int x; int y; } Point; 这叫匿名结构体。类型本身没有标签名,只有Point这个别名。大多数场景下够用,但如果你要在结构体内部引用自己(比如链表节点),就必须保留标签:
typedef struct Node { int data; struct Node *next; } Node; 注意next指针的类型写的是struct Node *,不是Node *。因为在typedef那一行还没结束的时候,Node这个别名还不存在。编译器读到struct Node *next时,只认识struct Node这个标签。这是新手常踩的坑,编译报错“unknown type name 'Node'”基本就是这个原因。
我见过不少人写链表时把next声明成Node *next,然后死活编不过。改回struct Node *立刻就好。不是玄学,是C的声明解析顺序问题。
再说一个实际观察。Linux内核代码里大量使用typedef struct,但风格跟教科书不太一样。比如:
typedef struct { unsigned long flags; // ... } spinlock_t; 它倾向于把_t后缀作为类型名的结尾,而且经常省略结构体标签。这种写法在驱动开发里到处都是。反过来,有些公司代码规范禁止用typedef隐藏结构体,要求必须写struct xxx,理由是让读者一眼看出这是个结构体而不是基本类型。两种做法都有道理,吵了几十年也没结果。
从编译器角度看,typedef不产生任何运行时代码。它纯粹是给编译器看的名字映射。预处理阶段结束后,typedef的信息保留在符号表里,编译到目标文件时早就没了。所以别指望用typedef来“优化”什么,它只影响你写代码的手感。
还有一点。C和C++在这件事上行为不同。C++里struct Point { ... };之后直接写Point p1;就是合法的,不需要typedef。C++把结构体标签自动提升为类型名。所以如果你从C++转过来写C,会下意识觉得struct Point p1很别扭。不是C啰嗦,是C++替你多做了一步。
那什么时候不该用typedef struct?如果你定义的结构体只在某个.c文件内部用,而且只用一两次,直接写struct { ... } var;也行。但多数情况下,结构体是要跨函数传递的,起个短名字利大于弊。代码里满屏的struct关键字并不会让逻辑更清晰。
总结一下实际写法:需要自引用就保留标签,不需要就匿名;next指针用struct Node *;类型别名尽量短且有意义。剩下的就是习惯问题。写多了之后,typedef struct会变成肌肉记忆,根本不用想。
Tags:
上一篇:如何合法访问境外网络
下一篇:网站测试报告
相关文章
杭州3A等级信用认证
百科杭州滨江区的那家做跨境支付的小公司,去年差点死掉。原因不是技术不行,是海外合作方查了他们的信用档案,发现没有3A等级认证,直接砍掉了预付款额度。老板老周跟我复盘时说,那感觉就像你去银行贷款,明明账上躺 ...
【百科】
阅读更多Web安全攻防
百科凌晨三点,某电商平台的运维被手机震醒。监控大屏上,数据库连接数像心电图一样狂跳——有人正用撞库拿到的账号批量登录,试图把用户余额转走。这不是电影,是Web安全的日常。 Web攻击的本质,说穿了就一句话 ...
【百科】
阅读更多网络订票系统可能存在的风险分析
百科12306刚上线那年,春运抢票的崩溃场面还历历在目。页面转圈转到天荒地老,最后告诉你“系统繁忙”。那时候大家骂的是技术烂,但很少有人意识到——当几亿人的身份证号、手机号、家庭住址全堆在一个系统里,这本 ...
【百科】
阅读更多