#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
答案 0 :(得分:1)
在您的计划中,您只是将功能start()
和stop()
的地址分配给cbstart
功能中的相应回调cbstop
和init()
,但不是使用它们来调用相应的功能。
此外,您无需将函数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();
}
您还可以删除cbstart
和cbstop
声明,除非它们将在其他地方使用。