简化版--可变参函数的实现,B中拿到函数指针,再调用C中给出的函数接口实现把函数指针送到C,最终由C调用指针传递日志。

#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模块的日志打印传递还会调用其他模块进行数据传递。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值