用回调调用两个函数

时间:2017-10-26 05:50:30

标签: c callback

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef void (*tstart)(void);
typedef void (*tstop)(void);
static tstart cbstart = NULL;
static tstart cbstop = NULL;

void init(tstart st,tstop stp)
{
      printf("in_init_func\n");
    sleep(5);
      cbstart = st;

    sleep(5);
      cbstop =  stp;
}

void start()
{
      printf("in_start_func\n");
}

void stop()
{
      printf("in_stop_func\n");
}

int main()
{
      init(start,stop);
}

我一直试图通过一个回调函数调用两个函数 结果,我的结果低于结果。

$ ./a.exe in_init_func

2 个答案:

答案 0 :(得分:1)

在您的计划中,您只是将功能start()stop()的地址分配给cbstart功能中的相应回调cbstopinit(),但不是使用它们来调用相应的功能。

此外,您无需将函数start()stop()的地址传递给init()函数。由于start()stop()函数定义在此翻译单元中可见,因此您只需在init()之前声明它们。

#include <stdio.h>

typedef void (*tstart)(void);
typedef void (*tstop)(void);
static tstart cbstart = NULL;
static tstop cbstop = NULL;

void start();
void stop();

void init()
{
        printf("in_init_func\n");
        cbstart = start;
        cbstop =  stop;
}

void start()
{
      printf("in_start_func\n");
}

void stop()
{
      printf("in_stop_func\n");
}

int main()
{
        init();
        if (cbstart)
                cbstart();
        if (cbstop)
                cbstop();
        return 0;
}

init()之后,取消引用时,cbstart可用于调用函数start()cbstop可用于调用函数cbstop

答案 1 :(得分:0)

您需要调用这些功能。将init()更改为

void init(tstart st,tstop stp)
{
    printf("in_init_func\n");
    sleep(5);
    st();

    sleep(5);
    stp();
}

您还可以删除cbstartcbstop声明,除非它们将在其他地方使用。