C语言实现 Callback Function 例子

Posted by Srefan on July 15, 2017

一.概述

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

二.实现

  • 定义回调函数的原型
1
2
// 定义callback function类型
typedef int (*exampleCallback)(char *);
  • 声明一个该函数指针的变量.
1
2
// 声明函数指针变量 examplecb, 指向 NULL
static exampleCallback examplecb = NULL;
  • 实现回调函数的功能实现
1
2
3
4
5
6
7
// 实现回调函数, 输出 Hello World
static
int showHelloworld(char * name)
{
    printf("Hello World, %s.\n", name);
    return 0;
}
  • 实现 bsp_show 函数, 功能为: 完成倒计时后, 执行 回调函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 函数, 程序启动的入口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 由 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;
}
  • 完整代码 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#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 中国大陆”许可协议 授权.

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