一节课掌握大厂技术 委托和反射

78 篇文章 1 订阅
12 篇文章 0 订阅
令人困惑的“高逼格”机制
令人困惑的委托机制:

C 语言,从最底层理解委托机制

 

// 委托 1:计算机科学与技术教育 void computerEdu(const char* name) { printf("%s 学习:操作系统\n", name); printf("%s 学习:计算机组成原理\n", name); printf("%s 学习:数据结构\n", name); printf("%s 学习:数据逻辑电路\n", name); printf("%s 学习:编译原理\n", name); }// 委托 2:体育教育 void tiYuEdu(const char* name) { printf("%s 学习:篮球\n"); printf("%s 学习:田径\n"); printf("%s 学习:八段锦\n"); printf("%s 学习:足球\n");
}void xiangQing(const char* name) { printf("%s, 此处省略一万字....\n", name); }// university("张三", computerEdu); // 执行:stuNmae = "张三" edu = computerEdu void university(const char* stuNmae, void(*edu)(const char*)) { edu(stuNmae); }int main(void) { university("张三", computerEdu); university("张三", tiYuEdu); university("张三", xiangQing); }
令人困惑的反射机制:(Java 的反射机制)

C 语言,从最底层理解反射机制

struct node { const char* name; void (*func)(); };struct node nodes[] = { {"钓鱼", diaoYu}, {"撸代码", luMa}, {"吃东西", eat},
{"游泳", youyong}, };// 参数:喜欢的活动名 void findLove(const char* name) { int count = sizeof(nodes) / sizeof(nodes[0]); for (int i = 0; i < count; i++) { if (strcmp(name, nodes[i].name) == 0) { nodes[i].func(); return; } } }

 优化:使用编译器的预编译指令,定义数据段(仅 gcc/g++编译器支持)

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef void(*calc_t)(int, int); typedef struct { const char* name; calc_t fn; } node_t; // 仅 gcc 支持! #define SEC __attribute__((__section__("ss"), aligned(sizeof(node_t)))) void f1(int a, int b) { printf("%s %d %d %d\n", __func__, __LINE__, a, b); }void f2(int a, int b) { printf("%s %d %d %d\n", __func__, __LINE__, a, b); }// 编译器会自动提供__start_ss,__stop_ss 标志段 ss 的起止地址 extern size_t __start_ss; extern size_t __stop_ss;
// 结构体变量 a 位于自定义段 ss node_t a SEC = { "cmd1", f1 }; void do_callback(const char* name) { size_t i; for (node_t* p = &__start_ss; p < &__stop_ss; p++) { if (!strcmp(p->name, name)) { return p->fn(1, 2); } } }// 结构体变量 b 位于自定义段 ss node_t b SEC = { "cmd2", f2 }; int main(int argc, char** argv) { do_callback("cmd2"); return 0; }

今天的分享就到这里了,大家要好好学C语言/C++哟~

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言从入门到精通(C语言入门C语言教程C语言零基础C语言基础C语言学习C
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)加君羊获取哦~
C语言C++编程学习交流圈子,企鹅君羊:763855696 【点击进入】
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值