#include<stdio.h>
#include<stdarg.h>
typedef void (*LogFunction)(const char*, va_list);
LogFunction *recv_ptr=NULL;
int iCount =10;
int *p;
void log_entry(const char* format, ...)
{
//app中实现的日志处理函数
va_list ap;
va_start(ap, format);
vfprintf(stdout, format, ap);
va_end(ap);
}
int test_log_entry(/*char a[],char b[]*/void){
//app中实现的测试代码
p =&iCount;
log_entry("hahahahaha,%d\n",*p);
log_entry("我是%d号机器人,我将为您服务\n", 1234);
return 0;
}
void get_log_intf(LogFunction **log_func) {
if (*log_func == NULL) {
*log_func = &log_entry;
}
}
void send_log_intf(LogFunction **log_func) {
//协议栈中要实现的内容
//协议栈把传过来的数据通过全局变量recv_ptr存下最终可以调用*recv_ptr进行打印数据
//if (*log_func != NULL) {
recv_ptr = malloc(sizeof(LogFunction));
if(recv_ptr!=NULL){
//*recv_ptr = log_entry;
recv_ptr = *log_func;
printf("%p\n",*log_entry);
printf("%p\n",recv_ptr);
(*recv_ptr)("我是%d号机器人3,我将为您服务\n",22);
}else{
printf("recv_ptr ==NULL\n");
}
}
// 在需要的地方,将log_entry赋值给函数指针
int main(int argc,char* argv[]) {
//serivice 里面实现的内容,从APP端拿到接口后,可以使用log打印接口进行打印数据;
//再把函数指针通过send发送到协议栈中。协议栈把传过来的数据通过全局变量recv_ptr存下最终可以调用*recv_ptr进行打印数据
test_log_entry(/*argv[]*/);
LogFunction *log_ptr = NULL; // 将log_entry地址赋值给函数指针
log_ptr = malloc(sizeof(LogFunction));
printf("%p\n",log_ptr);
if (log_ptr == NULL) {
printf("Memory allocation failed for log_ptr.\n");
exit(1); // 或者处理其他异常情况
}
get_log_intf(log_ptr); // 调用send_log,并传递log_ptr
//printf("%p\n",log_ptr);
(*log_ptr)("我是%d号机器人,我将为您服务2\n",22);
send_log_intf(&log_ptr);
return 0;
}
目前都是在同一个文件中实现的,后面拆分成三个文件夹,代表三个模块。
A模块 实现可变参数的打印功能(log打印模块)
C模块 一个动态库
B模块 open 动态库,获取到动态库指针,调用动态库的函数接口,可以传递 从A模块拿到的函指针到动态库中,这样C模块就可以回调A中的函数实现日志打印。
实际上A模块的日志打印传递还会调用其他模块进行数据传递。