搬砖的时候,阅读的源码包括很多这样的形式:
typedef void (*evt_notify_fn)(phy_evt_param_t *param, void *arg);
evt_notify_fn fn;
可以说是一脸懵逼,于是去查了下C语言的函数指针与typedef。
1. 函数指针
int function(int);
int (*p)(int) = &function; //&是可选的
int ans = p(25); //调用函数的方法,也可以为(*p)(25)
函数指针主要用于回调函数,如下例:
/*
使用回调函数的目的在于使得链表查找与类型无关;
调用者根据自己的类型写比较函数,然后将函数传地址进去
*/
Node *
search_list( Node *node, void const *value,
int (*compare)(void const *, void const *) )
{
while( node != NULL ){
if( 0 == compare( &node->value, value ) )
break;
node = node->link;
}
return node;
}
2.typedef函数指针
#include<stdio.h>
typedef int (*FP_CALC)(int, int);
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return b? a/b : -1;
}
/*
定义一个函数,参数为op,返回一个指针。该指针类型为拥有两个int参数、
返回类型为int 的函数指针。
*/
FP_CALC calc_func(char op)
{
switch (op)
{
case '+': return add;//返回函数的地址
case '-': return sub;
case '*': return mul;
case '/': return div;
default:
return NULL;
}
return NULL;
}
int calc(int a, int b, char op)
{
FP_CALC fp = calc_func(op); //根据预算符得到各种运算的函数的地址
if (fp)
return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果
else
return -1;
}
3.解决问题
typedef void (*evt_notify_fn)(phy_evt_param_t *param, void *arg);
evt_notify_fn fn;
我的理解是evet_notify_fn可以看作一类指针类型,fn只是它的一个实例。
什么指针类型呢?
就是void any_function(phy_evt_param_t *param, void *arg)的指针类型。
也就是说,我可以使:
fn = any_function(phy_evt_param_t *param, void *arg);