typedef函数指针的用法

目的:实现代码简化, 促进跨平台开发。
相似点:typedef 行为有点像 #define 宏,用其实际类型替代同义字。
不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。
用法一:
typedef int (MYFUN)(int, int);
这种用法一般用在给函数定义别名的时候,该例子定义MYFUN 是一个函数指针,函数类型是带两个int 参数, 返回一个int。在分析时可以用下面的方法:
先去掉typedef 和别名,剩下的就是原变量的类型。
去掉typedef和MYFUN以后就剩:
int (
)(int, int)

用法二:typedef给变量类型定义一个别名。构造方法:typedef 原变量类型 别名
例如:

typedef struct
{
int a;
int b;
}MY_TYPE;

这里把一个未命名结构直接取了一个叫MY_TYPE的别名,这样如果想定义结构的实例的时候就可以:
MY_TYPE tmp;

补充内容:
1、typedef int (*PF) (const char *,const char *);
*/ 声明中引入了PF类型作为函数指针的同义字,该函数有两个const char * 类型的参数以及一个 int 类型的返回值 */
2、简单的函数指针的用法

// 形式1:返回类型(*函数名)(参数表)
char(*pFun)(int);	//定义指针变量pFun,一个指向某种函数的指针,函数						参数是一个int类型,返回值是char类型
char glFun(int a)		// 定义函数glFun(),以int为参数返回char的函数
{
return;
}
void main()
{
pFun =glFun;
(*pFun)(2);
}

// 形式2:使用typedef进行定义
typedef  char(*PTRFUN)(int)     // typedef的功能是定义新的类型,定义									PTRFUN的类型,并定义这种类型为指向某种函						数的指针,这种函数以一个int为参数并返回char类型
PTRFUN  pFun;
char glFun(int a)
{
return;
}
void main()
{
pFun = glFun;
(*pFun)(2);
}

例子:

// 定义四个函数
int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);

typedef  int (*FP_CALC)(int, int);   // 定义指向这类函数的指针
FP_CALC calc_func(char op);	// 定义一个函数calc_func,根据操作字符 op 返								回指向相应的计算函数的指针
int calc(int a, int b, char op);   // 根据op返回相应的计算结果值
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,而不是两个整形,只返回了一个函数指针,相当于 FP_CALC calc_func(char op)
int (*s_calc_func(char op)) (int, int)
{
    return calc_func(op);
}
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);
       int (*s_fp)(int, int) = s_calc_func(op);	 // 类似的直接定义指向函数指针变										量,不用typedef来实现指向函数的指针
       ASSERT(fp == s_fp); 	// 可以断言这俩是相等的
      if (fp) 
{
return fp(a, b);
}
      else 
{ 
return -1;
}
}
void test_fun()
{
    int a = 100, b = 20;
    printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
    printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
    printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
    printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
}

运行结果:

   calc(100, 20, +) = 120
   calc(100, 20, -) = 80
   calc(100, 20, *) = 2000
   calc(100, 20, /) = 5
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值