首页 > 其他分享 >C语言支持闭包

C语言支持闭包

时间:2022-11-28 03:55:07浏览次数:37  
标签:闭包 para int void 支持 C语言 para2 para1 duration

前言

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 *)&para2, (void *)&para2, 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 *)&para1;
    para.para2 = (void *)&para2;
    Loop(duration, maxTimes, &para);
}

int main()
{
    Demo_LoopDoV1();
    Demo_LoopDoV2();

    return 0;
}

标签:闭包,para,int,void,支持,C语言,para2,para1,duration
From: https://www.cnblogs.com/aaron2932/p/16931229.html

相关文章

  • 让uniGUI支持https
    今天在专家的帮助下,成功的让uniGUI支持https了。首先,去申请个免费的证书。我同事去阿里申请的,申请回是一个zip文件,里面有两个文件,一个扩展是per,一个key然后,把这两个证书......
  • 从C语言到C++
    一、头文件区别总结:原来C语言头文件的后缀.h直接删除,在首元素前面加前缀c即可。特例:输入输出函数的头文件改动较大,前面是io,后面是stream(流)二、如何输入输出1、......
  • Rust闭包
    很多语言中都有闭包的概念,闭包就是一个能够捕获周围作用域中变量的函数,它们通常以简洁的形式展现,比如lambda表达式。Rust的Lambda表达式Rust中的闭包也是lambda表达式形......
  • C语言网站用户管理系统
    C语言网站用户管理系统网站用户管理系统【问题详述】编写应用程序,模拟网站对注册用户进行管理。网站对注册用户提供一些付费或免费的文件下载或在线娱乐活动,用户参与......
  • linux下的C语言编程(总结篇)
      在Linux下面关于C语言的内容其实挺多的。不同的人关注的地方也不一样。关注系统设计的人可能更关注整个linux系统的结构;设计驱动的人可能更关注linux驱动的配置和......
  • 完整解决方案:让你的IIS 支持PHP方法
    目前很多​​站长​​都开始使用PHP来编写网站代码,而且目前开源的PHP系统也很多,但是MSIIS(internetinformationsystem)并不支持PHP,这给我们调试和使用PHP站点带来了很多困......
  • 用虚拟机VMware安装雪豹提示:当前主机无法支持64位操作系统
    这个原因我知道,因为你的CPU不支持Intel虚拟化技术,所以无法在32位主机上装64位系统,100%的原因。AMD的CPU有很多都支持的,但是Intel的,据我所知,T6600都不行,T6670才支持虚拟化技......
  • 怎么让IIS支持PHP
    php安装包中就存在安装方法。下面资料是在%phproot%\install.txt文件中提到的。我通常都按照这个方法配置IIS+php,白试百灵。当然php离开M......
  • 详解支持向量机-SVC的模型评估指标【菜菜的sklearn课堂笔记】
    视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili从上一节的例子中可以看出,如果我们的目标是希望尽量捕获少数类,那......
  • 10:生成器 迭代器 装饰器 闭包
    一:生成器#生成器:为了节约内存,拿到内存地址一边循环一边计算a=(x*2forxinrange(1,8))print(a)print(next(a))print(next(a))<generatorobject<genexpr>at0x00934......