typedef用法小结(二)

 1、利用typedef定义函数指针

 代码简化,促进跨平台开发

 typedef行为有点类似#define  宏,用其实际类型替代同义字。

  不同点:typedef 在编译时被解释,因此让编译器来 应付超越预处理器能力的文本替换

用法一:

  typedef  int  (* func)(int,  int);-----------这种用法一般用在给函数定义别名的时候;

  形式:typedef  返回值类型   (*函数别名)(参数列表)

  上面的例子定义func 是一个函数指针, 函数类型是:参数为两个int,  返回值为:int

分析方法如下:

  先去掉typedef和别名,剩下的就是原变量的类型。

  如:int  (*func)(int ,   int )

char  (*pFun)(int);  //定义了一个指针变量pFun,它是一个指向某种函数的指针,这种函数参数是一个int类型。

    //只有这一句我们还无法使用这个指针,因为我们还没对它进行赋值

char  glFun(int a){return ;}  //定义量一个函数glFun(),该函数正好是一个以int为参数返回char的函数,

    //我们从指针的层次上理解函数,函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址;

int main()

{

  pFun = glFun;

  (*pFun)(2);

  return 0;

}

 

用法二:

  typedef  给变量类型定义一个别名:

  typedef  struct{

    int  id;

    char name[10];

  }mystruct;

  这里把一个还未命名的结构体直接取了一个mystruct的别名。

  这样如果定义结构体的实例可以这样:

  mystruct   tmp;

 

 1 #include <stdio.h>

 2 

 3 typedef int (*FP_CALC)(int, int);

 4 

 5 int  add(int a, int b)

 6 {

 7     return a + b;

 8 }

 9 

10 int sub(int a, int b)

11 {

12     return a - b;

13 }

14 

15 int mul(int a, int b)

16 {

17     return a * b;

18 }

19 

20 int div(int a, int b)

21 {

22     return b?a/b:-1;

23 }

24 

25 //定义一个函数,参数是op,返回值是一个函数指针,

26 //该函数指针类型:参数是2个int, 返回值是int

27 //该函数的作用是根据操作符返回对应函数的地址;

28 30 FP_CALC calc_func(char op) 

31 {

32     switch (op)

33     {

34         case '+': return add;   //返回地址

35         case '-': return sub;

36         case '*': return mul;

37         case '/': return div;

38         default:

39                   return NULL;

40     }

41     return NULL;

42 }

43 

44 //s_calc_func为函数,参数是op;

45 //返回值为一个拥有  两个int参数,返回类型为int的函数指针

47 int (*s_calc_func(char op))(int, int)

48 {

49     return calc_func(op);

50 }

51 

52 //最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果

53 int calc(int a, int b, char op)

54 {

55     FP_CALC fp = calc_func(op); //根据预算得到各种运算的函数地址;

56         int (*sp)(int, int) = s_calc_func(op);  //用于测试;

57 //  ASSERT(fp = sp); //设置断言

58         if(fp) return fp(a, b); //根据上一步得到的函数的地址调用相应函数,并返回结果

59             else return -1;

60 }

61 

62 int main()

63 {

64     int a = 100, b = 20;

65     printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));

66     printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));

67     printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));

68     printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));

69     return 0;

70 }

71  

你可能感兴趣的:(typedef)