甘肃省建设工程安全质量监督管理局网站官网网站开发项目流程
2026/1/11 23:55:34 网站建设 项目流程
甘肃省建设工程安全质量监督管理局网站官网,网站开发项目流程,餐饮公司网站建设的特点,双八网站建设一、为什么学 C 回调会觉得“抽象”#xff1f; 很多 Android / Java 开发者在第一次接触 C 回调时#xff0c;都会被下面这种代码劝退#xff1a; typedef struct {void (*open)(void* self);void (*close)(void* self); } Ops; 看起来既不像函数#xff0c;也不像类很多 Android / Java 开发者在第一次接触 C 回调时都会被下面这种代码劝退typedef struct { void (*open)(void* self); void (*close)(void* self); } Ops;看起来既不像函数也不像类更不像接口。但当我真正理解它之后才发现这套写法本质上和 Android 的接口回调是完全一致的只是语法层面更底层。二、从 Android 的 setOnClickListener 说起在 Android 中我们非常熟悉这种写法button.setOnClickListener(listener);这里发生了三件事listener是一个对象实例它实现了OnClickListener接口系统在合适的时机回调listener.onClick(view);关键点在于系统并不关心 listener 的具体类型只关心你有没有实现规定的方法三、C 语言里没有接口那怎么办C 语言没有classinterfacethis但系统级代码同样需要回调解耦多态于是 C 选择了一种“手工实现接口”的方式struct 函数指针四、OpsC 里的“接口定义”typedef struct { void (*open)(void* self); void (*close)(void* self); } Ops;这段代码不是在实现逻辑而是在做一件事定义一组能力约定接口可以直接在脑子里翻译成 Javainterface Ops { void open(); void close(); }区别只有一个Java 有隐式thisC 需要显式传self五、void* self 是什么void* self的本质是C 版的 this / Context / 上下文对象因为 C 没有对象模型所以谁在调用状态在哪里都必须由调用方手动传入。void file_open(void* self) { File* f (File*)self; printf(%d\n, f-fd); }这和 Java 里的void open() { System.out.println(this.fd); }在“角色”上是完全等价的。六、接口是怎么“绑定实现”的很多人会问file_open为什么会成为open的实现答案不在函数名而在赋值Ops file_ops { .open file_open, .close file_close };这一刻发生了绑定file_ops.open指向file_openfile_ops.close指向file_close之后的调用file_ops.open(f);等价于file_open(f);七、file_ops 是什么角色可以非常准确地说file_ops是一个“接口实例 / 方法表 / 回调对象”它就像 Android 里的OnClickListener listener new MyClickListener();只不过在 C 里方法表Ops对象实例self被拆开保存。八、一句话总结构成完整模型**C 的接口回调 struct接口定义函数指针方法void* selfthis / Context**这并不是“奇怪的 C 写法”而是在没有语言级支持的情况下手工实现的面向对象与接口机制。九、写在最后当我把 C 的这套回调模型和 Android 的接口机制对齐之后才真正意识到语言不同但工程思想是完全相通的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询