Linux下C语言可变参数的回调函数

13 篇文章 0 订阅
2 篇文章 0 订阅

摘要

函数指针  可变宏    注册回调函数   调用回调函数

前言

这是一个小代码片, 这种类型的函数指针一般应该是打印日志,按格式写东西用的。因此这里的源码部分提供的是可变参数的第一个为一个只读字符串格式。

假如是可变参数的第一个带入的是个数的话,

可参考https://blog.csdn.net/u014646950/article/details/52846090

typedef char byte;
/*定义函数指针类型*/
typedef  int(*pf_put)(const int cnt,...);
void write_byte(const int cnt,...)
{
  va_list args;//char*args;
  va_start(args,cnt);//(args=(va_list)(&cnt)+_INTSIZEOF(cnt)); 
  int i=0;
  for(;i<cnt;i++)
  {
     //注释的提升到int
     byte t=va_arg(args,int);//char:int
 
     printf("%c\n",t);
  }
 
  va_end(args);//(args=(va_list)0);
}

 许多开源的C项目中会用到注册回调函数,信号注册函数也是类似,只是参数是固定的。

源码

/*
compile:gcc  a.c
run:./a.out
*/
#include<string.h>
#include<stdio.h>
#include<stdarg.h>
/*可变宏,直接调用的,本程序中未使用*/
#define  P_WRITE(format,...)    hhw(format,##__VA_ARGS__)
/*定义函数指针类型*/
typedef  int(*pf_put)(const char*format,...);
/*具体实现的函数体*/
int hhw(const char*formt,...)
{
    va_list  ap;
    int ret;
    va_start(ap,formt);
    ret=vprintf(formt,ap);
    va_end(ap);
    return ret;
}
void register_p(pf_put *a)
{
    (*a)=hhw;
}
void callback_done(pf_put a)
{
    a("%s %d\n","test",5);
}
int main(){
    pf_put  mycall=NULL;
    register_p(&mycall);
    callback_done(mycall);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值