天天看点

C语言:typedef定义函数指针

在typedef的使用中,最麻烦的是指向函数的指针,如果没有下面的函数,你知道下面这个表达式的定义以及如何使用它吗?   int (*s_calc_func(char op))(int, int);   如果不知道,请看下面的程序,里面有比较详细的说明   #include<stdio.h>   // 声明四个函数

//int add(int, int);

//int sub(int, int);

//int mul(int, int);

//int div(int, int);   // 定义指向这类函数的指针

typedef int (*FP_CALC)(int, int);   int (*s_calc_func(char op))(int, int);

// int (*s_calc_func(char op))(int, int);和FP_CALC calc_func(char op);一样

// 定义一个函数calc_func,它根据操作字符 op 返回指向相应的计算函数的指针

FP_CALC calc_func(char op);   // 根据 op 返回相应的计算结果值

int calc(int a, int b, char 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,而不是最后的两个整形

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); // 下面是类似的直接定义指向函数指针变量

 // 下面这行是不用typedef,来实现指向函数的指针的例子,麻烦!

 int (*s_fp)(int, int) = s_calc_func(op);

 // ASSERT(fp == s_fp); // 可以断言这俩是相等的

 if(fp)

  return fp(a, b);

 else

  return -1;

}   void main()

{

 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

继续阅读