C语言结构体的“继承”
这里说的继承有点像C++里的父类和子类,实际上是结构体类型的强制转换,最近看Linux内核源码时经常接触到这种方法,在这里就当作是一个简单的学习吧。
下面给出一个Demo,很简单,分别定义了一个father结构体和一个son结构体,father结构体里定义了2个整形变量,son结构体里的第一个成员是father结构体类型的变量,son里的另外2个成员也是整形变量,这样,son结构体就好像继承了father结构体,并增加了2个成员,代码如下:
1 #include <stdio.h> 2 3 //父结构体 4 struct father 5 { 6 int f1; 7 int f2; 8 }; 9 10 //子结构体 11 struct son 12 { 13 //子结构体里定义一个父结构体变量,必须放在子结构体里的第一位 14 struct father fn; 15 //子结构体的扩展变量 16 int s1; 17 int s2; 18 }; 19 20 void test(struct son *t) 21 { 22 //将子结构体指针强制转换成父结构体指针 23 struct father *f = (struct father *)t; 24 //打印原始值 25 printf("f->f1 = %d\n",f->f1); 26 printf("f->f2 = %d\n",f->f2); 27 //修改原始值 28 f->f1 = 30; 29 f->f2 = 40; 30 } 31 32 int main(void) 33 { 34 struct son s; 35 s.fn.f1 = 10; 36 s.fn.f2 = 20; 37 38 test(&s); 39 //打印修改后的值 40 printf("s.fn.f1 = %d\n",s.fn.f1); 41 printf("s.fn.f2 = %d\n",s.fn.f2); 42 43 return 0; 44 }
在这里,关键是把father类型的变量放在son结构体里的第一位。运行效果:
修改son结构体,使得father类型的变量不是放在son结构里的第一位,修改后如下:
1 //子结构体 2 struct son 3 { 4 //子结构体的扩展变量 5 int s1; 6 int s2; 7 struct father fn; 8 };
修改后的运行效果:
总结:
这种方法对于结构体的扩展很有用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~