C语言支持闭包
前言
c语言不支持闭包函数,因此需要通过参数结构体保存所有参数,将上下文传递给业务
概述
下面是一个例子,用于重试
#include <stdio.h> #include <unistd.h> typedef enum { E_SYNC_LOOP_REG, } E_SYNC_LOOP_DO; // when return 0, indict false, otherwise indict true, will break typedef int (*FnLoopCall)(void *para1, void *para2, void *para3); typedef struct { // int (*fnCall)(void *para1, void *para2, void *para3); FnLoopCall fn; void *para1; void *para2; void *para3; } LoopDoPara; void Loop(int duration, int times, LoopDoPara *para) { int ret; int i; for (i = 0; i < times; i++) { ret = para->fn(para->para1, para->para2, para->para3); if (ret == 0) { break; } printf("current retry (%d)\n", i); sleep(duration); /* code */ } return; } int mayBeFail(void *para1, void *para2, void *para3) { int a = *((int *)para1); int b = *((int *)para2); printf("para1(%d) para2(%d)\n", a, b); return -1; } void Demo_LoopDoV1() { printf(">>>>>>>current retry in v1\n"); int i; int ret; int maxTimes = 4; int duration = 1; int para1 = 1; int para2 = 2; for (i = 0; i < maxTimes; i++) { ret = mayBeFail((void *)¶2, (void *)¶2, NULL); if (ret == 0) { break; } printf("current retry (%d)\n", i); sleep(duration); /* code */ } } void Demo_LoopDoV2() { printf(">>>>>>>current retry in v2\n"); int maxTimes = 4; int duration = 1; LoopDoPara para = {0}; para.fn = mayBeFail; int para1 = 1; int para2 = 2; para.para1 = (void *)¶1; para.para2 = (void *)¶2; Loop(duration, maxTimes, ¶); } int main() { Demo_LoopDoV1(); Demo_LoopDoV2(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】