两个模块的函数如何相互调用?
两个模块函数交互
如何调用其他模块的函数。
一般如果自己是主要提供接口服务的,那么调用使用者模块的函数,叫回调。这样可以保证一定的逻辑顺序。比如A、B、C 3个模块是从高到低的逻辑。比如A调用B,B调用C,C回调B,B回调A。
如果是A调用B,再说B调用A,体现不出逻辑是从A到B的。
如果是从自己调用他人的角度,正常调用的角度。
1、在知道函数的情况下,直接调用其他模块的函数。不利于移植,有耦合性,其他模块的函数修改了,我也要修改。
2、用接口调用,用钩子函数来调用其他模块的函数,由其他模块负责函数指针的注册,不需要知道其他模块函数是什么。(钩子函数也就相当于知道了每一个函数名称而已)
如果是从自己回调他人的角度。
2、用接口来调用,双方定义一个函数接口,我在本地定义一个函数指针,对方需要注册该函数指针,那么我调用我自己的函数指针就相当于调用了别人的函数。
别人来注册函数指针,我可以提供注册的接口。(也就是将别人的函数指针赋值给我的指针的接口)。别人不需要提供任何接口,只需要用我的注册函数,注册一下函数指针。
如果是单个函数指针,可能还比较特殊;如果是多个函数,那就要用一个普通的函数指针数组,将其他指针强制转换为该指针。
或者我调用别人提供的钩子函数。
如下:用第一种方法就是自己定义一个函数指针,别人注册,我再调用自己的函数指针。
用第二种方法就是我调用别人提供的钩子函数。我在本地什么都不保存。
#if INSTALL_A
Module_CbFunc_T cbFunc = NULL;
cbFunc = Module_CbFunc_Get(CB_SRV_CTRL_A);
if (NULL != cbFunc)
{
cbFunc(arg1, arg2, arg3);
}
#elif INSTALL_B
UINT32 ret = 0;
othermodule_client_callback(CB_SRV_CTRLA,arg1, arg2, arg3);
#endif
被调用者来注册函数指针。这是很显然的。