C语言实现 Callback Function 例子


一.概述

  • C语言, callback function是比较值得一学的一个知识点, 也是比较常用,优化代码结构的一个方法.
  • 主要概念就是: 传回某个函数的指针, 调用者即可通过该函数指针直接执行函数.

二.实现

  • 定义回调函数的原型
// 定义callback function类型
typedef int (*exampleCallback)(char *);
  • 声明一个该函数指针的变量.
// 声明函数指针变量 examplecb, 指向 NULL
static exampleCallback examplecb = NULL;
  • 实现回调函数的功能实现
// 实现回调函数, 输出 Hello World
static
int showHelloworld(char * name)
{
    printf("Hello World, %s.\n", name);
    return 0;
}
  • 实现 bsp_show 函数, 功能为: 完成倒计时后, 执行 回调函数
static
void bsp_show(int time, char *name)
{
    while (time > 0)
    {
        printf("%d\n", time);

        time--;
        sleep(1);

        if ((time == 0) && examplecb)
        {
          	// 调用回调函数
            examplecb(name); 
          	// 清空回调函数
            examplecb = NULL;
        }
    }
}
  • 实现 main 函数, 程序启动的入口
// 由 main 执行, 程序入口
int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    
    int timeout = atoi(argv[1]);
    char * name = argv[2];

    // 设置函数指针为 showHelloworld 回调函数
    examplecb = showHelloworld;

    bsp_show(timeout, name);
    return 0;
}
  • 完整代码 :
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// 定义callback function类型
typedef int (*exampleCallback)(char *);

// 声明函数指针变量 examplecb, 指向 NULL
static exampleCallback examplecb = NULL;

// 实现回调函数, 输出 Hello World
static
int showHelloworld(char * name)
{
    printf("Hello World, %s.\n", name);
    return 0;
}

static
void bsp_show(int time, char *name)
{
    while (time > 0)
    {
        printf("%d\n", time);

        time--;
        sleep(1);

        if ((time == 0) && examplecb)
        {
            // 调用回调函数
            examplecb(name); 
            // 清空回调函数
            examplecb = NULL;
        }
    }
}

int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }

    int timeout = atoi(argv[1]);
    char * name = argv[2];

    // 设置函数指针为 showHelloworld 回调函数
    examplecb = showHelloworld;

    bsp_show(timeout, name);
    return 0;
}

三.参考链接

此文参考于 易春木博客,十分感谢.
所有引用内容版权归原作者所有.
使用 知识共享“署名-非商业性使用-相同方式共享 3.0 中国大陆”许可协议 授权.

本文的 代码 在此处, 点击下载.

最近的文章

NTP 协议简单分析

一.概述 NTP (Network Time Protocol, 网络时间协议) 是由 RFC 5905 定义的时间同步协议, 用来在分布式时间服务器和客户端之间进行时间同步, 是一个跨越广域网或局域网的复杂的同步时间协议, 它通常可获得毫秒级的精度. NTP 基于 UDP 报文进行传输, 使用的UDP端口号为 123. 使用 NTP 的目的是对网络内所有具有时钟的设备进行时钟同步, 使网络内所有设备的时钟保持一致, 从而使设备能够提供基于统一时间的多种应用. 对于运行 NTP 的...…

协议控继续阅读
更早的文章

CMake 简单用法

一.概述 CMake Make 工具有很多,例如 GNU Make, QT 的 QMake, 微软的 MS nmake, BSD Make(pmake), Makepp 等等. 这些工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别, 如果要跨平台,就要为每一种标准写一次 Makefile. CMake 就是解决上述问题设计的工具. 首先, 允许开发者编写一种平台无关的 CMakeLists.txt 文件来定制真个编译流程,然后根据目标平台进一步生成所需的本地化 M...…

初学者继续阅读