C语言模拟对象、方法:“函数指针+结构体“复用函数指针指向的函数体 prefacec语言的函数指针结构体 模拟对象和方法复用函数指针指向的函数体助手思考过程本轮为直接概念问答未触发独立的 extended-thinking 块回答基于对 C 语言对象模拟机制的直接组织先给核心结论「复用同一份函数体」再用可运行代码证明a.bark b.bark然后强调self参数不可省最后升级到 vtable 的工程做法并关联到本仓库业务目录的内存表引擎复用思路。助手回复核心结论用「结构体存数据 函数指针存方法」模拟对象时函数体代码只有一份存在于代码段.text被所有对象共享每个对象各有一份数据结构体实例在堆/栈上函数指针只是指向那唯一一份函数体的地址不同对象的同名指针通常指向同一个函数。这和 C 的成员函数机制其实一样C 的成员函数也是一份代码靠隐藏的this指针区分是哪个对象。用代码看清楚typedefstructDog{charname[32];void(*bark)(structDog*self);// 函数指针 方法}Dog;// 唯一的一份函数体复用给所有 Dogvoiddog_bark(Dog*self){printf(%s: wang!\n,self-name);// 靠 self 区分数据}intmain(void){Dog a{a,dog_bark};Dog b{b,dog_bark};a.bark(a);// 输出 a: wang!b.bark(b);// 输出 b: wang!// 关键两个对象的函数指针指向同一地址printf(%d\n,a.barkb.bark);// 1同一个函数体}a.bark和b.bark值相同 —— 证明代码复用了同一函数体区别只在传入的self数据不同。关键点self参数不可省C 没有 C 的隐式this。函数体要访问当前对象的数据必须显式把对象指针传进去惯例命名self/this。否则一份共享的函数体无从知道该操作哪个实例的数据。更省内存的做法vtable如果每个对象都在结构体里塞一堆函数指针指针本身也会被每个实例复制一份浪费内存。工程上常把方法集中到一张虚表里对象只存一个指向虚表的指针typedefstructAnimalAnimal;typedefstruct{// 虚表全类共享一份void(*speak)(Animal*self);void(*eat)(Animal*self);}AnimalVTable;structAnimal{constAnimalVTable*vtbl;// 只存一个指针charname[32];};staticconstAnimalVTable DOG_VT{dog_speak,dog_eat};// 所有 Dog 实例的 vtbl 都指向 DOG_VT这就是 C 虚函数、以及 Linux 内核如file_operations、struct device的实现套路 ——函数体一份、虚表一份、数据每对象一份复用最大化。一句话总结是的函数指针只是地址指向的函数体被所有对象复用真正每个对象独立的是结构体里的数据靠显式self参数把数据喂给那份共享的代码。顺带一提这套模式在你这个app仓库里也有体现 —— 比如app业务的表通过TABLE_DESC/KEY/FIELD宏描述再由统一的内存表引擎代码去操作不同表的数据思路是相通的用一份引擎代码复用到多张表。需要的话我可以在仓库里找几个具体例子讲。